The codes below will allow the computation of the BNA score for any city in Europe. The coding languages are a combination of R and SQL, with a few lines passed onto the Command Prompt.

Workflow step by step

1. Establish a connection with the PostgreSQL server and establish basic parameters of analysis.

Within this step, three major things are performed, assuming that the user has created a database on its PostgreSQL. To test conneciton an empty table on the database called “test” was created on the public schema.

- Create connection and test it

library(RPostgreSQL)
Loading required package: DBI
# LOAD POSTGRESQL DRIVER
driver <- dbDriver("PostgreSQL")
# CREATE CONNECTION TO THE POSTGRESQL DATABASE
# THE CONNECTION VARIABLE WILL BE USED FOR ALL FURTHER OPERATIONS
connection <- dbConnect(
  driver, 
  dbname = db_name,
  host = local_host, 
  port = port_num,
  user = user_name, 
  password = rstudioapi::askForPassword("Database password")
)
ifelse(
  !dbExistsTable(connection, "test"),
  "The connection to the database was not possible.",
  "The connection to the database was successful!"
)
[1] "The connection to the database was successful!"
# DISCONNECT: Important when modifying the database on pgadmin4
# dbDisconnect(connection)

- Set up database

NOTICE:  extension "hstore" already exists, skipping
NOTICE:  extension "postgis" already exists, skipping
NOTICE:  extension "pgrouting" already exists, skipping
NOTICE:  schema "destinations" already exists, skipping
NOTICE:  schema "generated" already exists, skipping
NOTICE:  schema "received" already exists, skipping

- Establish Study Area and other important variables

Not only the name of the study area should be established, but also the number of subdivisions for the grid, the coordinate reference system to work with, and the biking distance that will be assumed for the connectivity analysis.

sa_name = "Cambridge"
subdivisions = 4
sa_crs = 3857
biking_distance = 3000 ## in meters
paste("You are running the BNA score for", sa_name, "within a biking distance of", biking_distance/1000, "km.")
[1] "You are running the BNA score for Cambridge within a biking distance of 3 km."

2. Obtain study area boundary with osmdata.

# FUNCTION TO EXTRACT STUDY AREA BOUNDARY WITH OSM AND WRITE IT TO THE DATABASE
sa_bb <- function (study_area, crs, conn){
  # GET DATA FROM OSM
  library(osmdata)
  library(sf)
  study_area_bb <- study_area %>% 
    getbb(format_out = "sf_polygon") %>%
    st_transform(crs = crs)
  
  # DELETE EXISTING BOUNDARY
  library(sqldf)
  sqldf(
    "DROP TABLE IF EXISTS received.sa_boundary",
    connection = conn
  )
  # UPLOAD BOUNDARY TO POSTGRESQL DATABASE
  library(RPostgreSQL)
  dbWriteTable(conn, c("received","sa_boundary"), study_area_bb)
  
  study_area_bb
}
boundary <- sa_bb(
  study_area = sa_name, 
  crs = sa_crs, 
  conn = connection
)
Data (c) OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright
Linking to GEOS 3.6.1, GDAL 2.2.3, proj.4 4.9.3
Loading required package: gsubfn
Loading required package: proto
Loading required package: RSQLite
sqldf will default to using PostgreSQL
library(tmap)
tmap_mode("view")
tmap mode set to interactive viewing
qtm(
  shp = boundary, 
  fill = NULL, 
  borders = "red", 
  basemaps = "OpenStreetMap"
)

3. Obtain the .osm file from Overpass API

# FUNCTION TO DOWNLOAD OSM DATA WITH THE OVERPASS API 
sa_download <- function(conn){
  # OBTAIN THE EXTENT OF THE STUDY AREA AS A BOUNDING BOX
  sa_extent <- dbGetQuery(conn,
        "SELECT
        ST_Extent((ST_Transform(geometry,4326)))
        FROM received.sa_boundary") 
  
  library(stringr)
  sa_coord <- toString(sa_extent) %>% 
    str_extract_all("\\-*\\d+\\.*\\d*") %>% 
    unlist() %>% 
    toString()
    
  # CONSTRUCT THE API LINE TO REQUEST THE DATA
  api <- paste(
    'https://overpass-api.de/api/map?bbox=',
    sa_coord,
    sep = ''
  )
  
  # CREATE A NEW TEMPORAL DIRECTORY TO DOWNLOAD THE INFO
  cd <- getwd()
  ifelse(
    !file.exists(file.path(cd,'temp')),
    dir.create(file.path(cd,'temp')), 
    "Directory already exists"
  )
  
  # ESTABLISH THE NAME OF THE FILE WHERE THE OVERPASS API WILL DOWNLOAD ITS DATA
  osm_file <- file.path(cd,'temp','overpass.osm')
  
  # REQUEST THE DATA FROM THE API
  library(utils)
  download.file(url = api, destfile = osm_file, extra = '-nv -O') 
  
  ifelse(
    file.exists(file.path(cd,'temp','overpass.osm')),
    "OMS data successfully downloaded!",
    "OSM data was not downloaded, please try again or download manually."
  )
  
}
# DOWNLOAD THE DATA FROM OSM WITH OVERPASS API
sa_download(conn = connection)
RS-DBI driver warning: (unrecognized PostgreSQL field type box2d (id:56298) in column 0)trying URL 'https://overpass-api.de/api/map?bbox=0.0686389, 52.1579417, 0.184552, 52.2372296'
Content type 'application/osm3s+xml' length unknown
downloaded 75.1 MB
[1] "OMS data successfully downloaded!"

4. Load data into the PostgreSQL database.

- Obtain configuration files

# CREATE A NEW TEMPORAL DIRECTORY TO DOWNLOAD THE INFO
cd <- getwd()
ifelse(
  !file.exists(file.path(cd,'temp')),
  dir.create(file.path(cd,'temp')), 
  "Directory already exists"
)
[1] "Directory already exists"
# ESTABLISH THE NAME OF THE FILES 
pfbstyle_file <- file.path(cd,'temp','pfb.style')
mapconfig_file <- file.path(cd,"temp","mapconfig.xml")
mapconfigbikes_file <- file.path(cd,"temp","mapconfig_for_bicycles.xml")
# CHECK IF THEY ARE DOWNLOADED
if(
  file.exists(file.path(pfbstyle_file)) & 
  file.exists(file.path(mapconfig_file)) &
  file.exists(file.path(mapconfigbikes_file))
){
  "Files are already downloaded!"
} else {
 # ESTABLISH THE URLS
  pfbstyle_url <- "https://raw.githubusercontent.com/azavea/pfb-network-connectivity/develop/src/analysis/import/pfb.style"
  
  mapconfig_url <- "https://raw.githubusercontent.com/pgRouting/osm2pgrouting/master/mapconfig.xml"
  
  mapconfigbikes_url <- 
  "https://raw.githubusercontent.com/pgRouting/osm2pgrouting/master/mapconfig_for_bicycles.xml"
  
  # REQUEST THE DATA
  library(utils)
  download.file(url = pfbstyle_url, destfile = pfbstyle_file)
  download.file(url = mapconfig_url, destfile = mapconfig_file)
  download.file(url = mapconfigbikes_url, destfile = mapconfigbikes_file) 
}
trying URL 'https://raw.githubusercontent.com/azavea/pfb-network-connectivity/develop/src/analysis/import/pfb.style'
Content type 'text/plain; charset=utf-8' length 11639 bytes (11 KB)
downloaded 11 KB

trying URL 'https://raw.githubusercontent.com/pgRouting/osm2pgrouting/master/mapconfig.xml'
Content type 'text/plain; charset=utf-8' length 1861 bytes
downloaded 1861 bytes

trying URL 'https://raw.githubusercontent.com/pgRouting/osm2pgrouting/master/mapconfig_for_bicycles.xml'
Content type 'text/plain; charset=utf-8' length 3013 bytes
downloaded 3013 bytes

- Load data with osm2pgsql and osm2pgrouting

NOTE: To run this command create a password file on %APPDATA%/postgresql/pgpass.conf with the format hostname:port:database:username:password

Replace variables between %:

system(
  command = "osm2pgsql -c -d %DBNAME% -U %USERNAME% -H %HOSTNAME% -W --create --prefix sa_full -S %CURRENTDIRECTORY/temp/pfb.style% %CURRENTDIRECTORY/temp/overpass.osm% --cache 600",
  show.output.on.console = TRUE
  )

system(
  command = "osm2pgrouting -f %CURRENTDIRECTORY/temp/overpass.osm% -h %HOSTNAME% --password %DBPASSWORD% -d %DBNAME% --username %USERNAME% --schema received --prefix sa_all_ --conf %CURRENTDIRECTORY/temp/mapconfig.xml% --clean",
  show.output.on.console = TRUE
)

system(
  command = "osm2pgrouting -f %CURRENTDIRECTORY/temp/overpass.osm% -h %HOSTNAME% --password %DBPASSWORD% -d %DBNAME% --username %USERNAME% --schema received --prefix sa_bike_ --conf %CURRENTDIRECTORY/temp/mapconfig_for_bicycles.xml% --clean",
  show.output.on.console = TRUE
)

5. Organize and prepare the database

On this step, several SQL queries are being run to organize the tables, clip them to the study area outline, merge it with the osm2pgsql data among other things. The scripts include mainly the code that PfB already uses, but with some modifications like changing feet to meters, mph to km/h, and others. Basically, 4 steps are taken:

- Organize tables

Which drops unused columns and projects data to the already established CRS. It also cleans the database for a new analysis to be run if the study area is changed for example.

- Clip data into boundary

Which clips the data into the boundary of the study area selected.

- Populate way table

Which does modifications to the following columns on the ways table:

> one way
> width
> functional class
> paths
> speed limit
> lanes
> park
> bike infrastructure
> class adjustments

- Populate intersection table

Which does modifications to the following columns on the intersection table.

> legs
> signalized
> stops
> rrfb
> island

An example of how the tables look like after this step:

SELECT * FROM received.sa_ways LIMIT 10;
SELECT * FROM received.sa_ways_int LIMIT 10;

The code for this step is not included as it is basically the same as the PfB code, and is actually quite long. However, it can be examined through the Rmd file for this R Notebook.

One additional value that I was considering on adding is slope, however I have not gone through with the complete implementation of the variable yet. This would also affect step 6.

6. Calculate stress

The same as step 5, this step considers mainly SQL queries already performed by PfB. It will mainly alter the columns meant to host the stress rank for segments and intersections. It considers different cases to do the classification. The scripts that can be further examined on the Rmd file are:

> motorway trunk
> higher order
> lower order
> living street
> track
> path
> one way reset
> motorway trunk intersection
> primary intersection
> secondary intersection
> tertiary intersection
> lower intersection

7. Build network

On this step the network is built by creating two tables: vertices and links. As the last 2 steps, the code won’t be include but can be analyzed on the Rmd file.

8. Generate population grid

So, this is one of the main differences regarding the PfB approach and mine. Instead of using US census blocks I used a population grid of 1 km2 for the entire European territory. Since its area is quite big, I created a subdivision code to split the data, considering partial populations for each new cell depending on the mother cell. To do this I followed two steps:

- Download data from EUROSTAT and load into DB

## Download data and load to PostgreSQL
if (!dbExistsTable(connection, c("received","geostat"))){
  
  # CREATE A NEW TEMPORAL DIRECTORY TO DOWNLOAD THE INFO
  cd <- getwd()
  ifelse(
    !file.exists(file.path(cd,'temp')),
    dir.create(file.path(cd,'temp')), 
    "Directory already exists"
  )
  
  # ESTABLISH THE NAME OF THE FILE WHERE THE GEOSTAT DATA WILL BE DOWNLOADED AND UNZIPPED
  geostat_file <- file.path(cd,'temp','geostat.zip')
  geostat_exdir <- file.path(cd,"temp","geostat")
  
  if (!file.exists(geostat_exdir)){
    # DEFINE THE URL FROM WHERE THE DATA COMES
  
    geostat_url <- 
      "https://ec.europa.eu/eurostat/cache/GISCO/geodatafiles/GEOSTAT-grid-POP-1K-2011-V2-0-1.zip"
    
    # DOWNLOAD THE FILE, UNZIP IT AND DELETE .ZIP
    
    library(utils)
    download.file(url = geostat_url, destfile = geostat_file)
    unzip(geostat_file, exdir = geostat_exdir)
    file.remove(geostat_file)
  }
  
  # CALL DATA INTO R AND REPROJECT
  library(sf)
  
  table_path <- file.path(
    geostat_exdir,
    "Version 2_0_1/GEOSTAT_grid_POP_1K_2011_V2_0_1.csv"
  )
  
  grid_path <- file.path(
    geostat_exdir,
    "Version 2_0_1/GEOSTATReferenceGrid/Grid_ETRS89_LAEA_1K-ref_GEOSTAT_POP_2011_V2_0_1.shp"
  )
  
  pop_table <- st_read(table_path)
  names(pop_table) <- pop_table %>% names() %>% tolower()
  
  pop_grid <- st_read(grid_path)
  pop_grid_t <- pop_grid %>% st_transform(crs = sa_crs)
  names(pop_grid_t) <- pop_grid_t %>% names() %>% tolower()
  
  # LOAD TO POSTGRESQL
  library(sqldf)
  sqldf(
    "
  DROP TABLE IF EXISTS received.pop_grid;
  DROP TABLE IF EXISTS received.pop_table;
    ",
  connection = connection
  )
  
  dbWriteTable(
    conn = connection,
    name = c("received","pop_grid"),
    value = pop_grid_t
  )
  
  dbWriteTable(
    conn = connection,
    name = c("received","pop_table"),
    value = pop_table
  )
  
  #### Join tables on data base and extract study area
  
  sqldf(
    "
-- Create join between .csv and .shp
DROP TABLE IF EXISTS received.geostat;
DROP INDEX IF EXISTS received.geostat_geom_idx;
CREATE TABLE received.geostat AS
 SELECT grid.grd_id, grid.geometry, tab.tot_p, tab.cntr_code, tab.year, tab.tot_p_con_dt
    FROM received.pop_grid grid, received.pop_table tab
    WHERE grid.grd_id = tab.grd_id;
CREATE INDEX geostat_geom_idx
  ON received.geostat
  USING gist
  (geometry);
  
DROP TABLE IF EXISTS received.pop_grid;
DROP TABLE IF EXISTS received.pop_table;
    ",
    connection = connection
  )
} else {
  "GEOSTAT data already loaded to database."
}
trying URL 'https://ec.europa.eu/eurostat/cache/GISCO/geodatafiles/GEOSTAT-grid-POP-1K-2011-V2-0-1.zip'
Content type 'application/zip' length 60101856 bytes (57.3 MB)
downloaded 57.3 MB
Reading layer `GEOSTAT_grid_POP_1K_2011_V2_0_1' from data source `E:\GeoTech\Thesis\Thesis_R_Project\temp\geostat\Version 2_0_1\GEOSTAT_grid_POP_1K_2011_V2_0_1.csv' using driver `CSV'
no simple feature geometries present: returning a data.frame or tbl_df
Reading layer `Grid_ETRS89_LAEA_1K-ref_GEOSTAT_POP_2011_V2_0_1' from data source `E:\GeoTech\Thesis\Thesis_R_Project\temp\geostat\Version 2_0_1\GEOSTATReferenceGrid\Grid_ETRS89_LAEA_1K-ref_GEOSTAT_POP_2011_V2_0_1.shp' using driver `ESRI Shapefile'
Simple feature collection with 2106228 features and 1 field
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 944000 ymin: 942000 xmax: 6503000 ymax: 5414000
epsg (SRID):    NA
proj4string:    +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs
NOTICE:  table "pop_grid" does not exist, skipping
NOTICE:  table "pop_table" does not exist, skipping
NOTICE:  table "geostat" does not exist, skipping
NOTICE:  index "geostat_geom_idx" does not exist, skipping
Warning message:
In postgresqlExecStatement(conn, statement, ...) :
  RS-DBI driver warning: (unrecognized PostgreSQL field type geometry (id:56267) in column 5)

- Generate subdivision with a grid, adding partial population and unique ID

sqldf::sqldf(
  "
DROP TABLE IF EXISTS received.sa_geostat;
DROP INDEX IF EXISTS received.sa_geostat_geom_idx;
-- Extract the grids concerning only the study area
CREATE TABLE received.sa_geostat AS
    SELECT  DISTINCT geo.grd_id, 
            CAST(geo.tot_p AS INTEGER), 
            geo.cntr_code, 
            geo.geometry
    FROM received.geostat geo, received.sa_ways w
    WHERE ST_Intersects(geo.geometry, w.geom);
CREATE INDEX sa_geostat_geom_idx
  ON received.sa_geostat
  USING gist
  (geometry);  
  ",
  connection = connection 
)
NOTICE:  table "sa_geostat" does not exist, skipping
NOTICE:  index "sa_geostat_geom_idx" does not exist, skipping
## Establish a function to create grid with different number of subdivisions, defaults to 9
grid <- function(s = 9){
  ## Call it as an sf object and then transform it to CRS:3035 to create grid
  library(sf)
  library(dplyr, quietly = TRUE)
  
  sa_pop_1km2 <- st_read(
    dsn = connection,
    layer = c("received", "sa_geostat")
  ) %>% 
    st_transform(crs = 3035)
  
  ## Determine number of horizontal and vertical cells
  h <- as.integer(as.numeric(diff(st_bbox(sa_pop_1km2)[c(1, 3)]))/1000)
  v <- as.integer(as.numeric(diff(st_bbox(sa_pop_1km2)[c(2, 4)]))/1000)
  
  ## Make grid
  grid <- sa_pop_1km2 %>% 
    st_make_grid(n=c(h*sqrt(s),v*sqrt(s)), what = "polygons") %>%
    st_sf() %>% 
    mutate(id = 1:n()) %>% 
    st_intersection(sa_pop_1km2)
  
  ## Filter grid by area of intersection because there are small polygons created.
  
  grid$area <- grid %>% st_geometry() %>% st_area() %>% as.numeric()
  
  grid <- grid %>% filter(area > 1)
  
  grid$area <- NULL
  
  grid <- within(grid, cell_id <- paste(grd_id,"C",id, sep = ""))
  
  grid$id <- NULL
  
  grid$partial_p <- grid$tot_p/s
  
  grid %>% st_transform(crs = sa_crs)
}
sa_grid <- grid(s = subdivisions) # Always consider a squared number to make an even division

Attaching package: 㤼㸱dplyr㤼㸲

The following objects are masked from 㤼㸱package:stats㤼㸲:

    filter, lag

The following objects are masked from 㤼㸱package:base㤼㸲:

    intersect, setdiff, setequal, union

attribute variables are assumed to be spatially constant throughout all geometries
sqldf::sqldf(
  "DROP TABLE IF EXISTS generated.sa_pop_grid",
  connection = connection
)
NOTICE:  table "sa_pop_grid" does not exist, skipping
## Load data into data base
RPostgreSQL::dbWriteTable(
  conn = connection,
  name = c("generated","sa_pop_grid"),
  value = sa_grid
)
[1] TRUE
library(tmap)
tmap_mode("view")
tmap mode set to interactive viewing
qtm(
  shp = sa_grid, 
  fill = NULL, 
  borders = "red", 
  basemaps = "OpenStreetMap"
)

Plotting the grid on this step can allow the analyst decide on a better number of subdivisions, depending on the study area. I hope to automatize this on a later effort.

- Prepare the population grid table

This step is only generating new columns on my new Population Grid table. It follows the same logic as the PfB and therefore won’t be inlcuded on this document explicitely.

9. Reachable roads scripts

This is the core of the whole BNA analysis, where the actual network analysis is performed. This step might take some computation time. It is again the same as PfB, and can be reviewed with more detail on the Rmd file. It basically uses pgrouting, therefore the Dijkstra algorithm to compute the driving distance considering the configuration established on step 7. It does it for the two levels of traffic stress:

> High stress
> Low stress

10. Establish connected population grids and compute their accessibility

On this step basically four procedures take place:

- Connect population grids

Where a new table sa_connected_pop_grid is created to summarize the connected cells by establishing them as source and target, including if they are connected by the low or high stress network, and obtaining the minimum the costs between cells.

- Compute population access

The access computation on this step fills up the sa_pop_grid table created on step 8, according to the PfB methodology.

To compute access on this an the next step, a weighting procedure is used, as the methodology of PfB does, which can be accessed here.

A quick glance of the weights used, mainly for step 11:

Scoring Category Measure
People = 15 Population = N/A
Opportunity = 20 Employment = 35
K-12 Education = 35
Technical/vocational school = 10
Higher Education = 20
Core Services = 20 Doctor offices/clinics = 20
Dentist offices = 10
Hospitals = 20
Pharmacies = 10
Supermarkets = 25
Social services = 15
Recreation = 15 Parks = 40
Recreational trails = 35
Community centers = 25
Retail = 15 Retail shopping = N/A
Transit = 15 Station/transit centers = N/A

It is important to note that this reproduction of the BNA for Europe does not include employment data, as until now, I have not located a source to provide this information as open data for the whole Europe. Therefore, the final results will show this category but with 0 or NA values.

- Extract common destinations

Which uses the osm polygons and points generated by osm2pgsql. The destinations included are:

> Colleges
> Community centers
> Dentists
> Doctors
> Hospitals
> Parks
> Pharmacies
> Retail
> Schools
> Social services
> Supermarkets
> Transit
> Universities

- Compute access to common destinations

Where the access to the destinations established before is computed. Access to recreational trails and bike paths is also included.

Once again, on this step I do not include the SQL codes, however they can be accessed through the Rmd file.

11. Compute overall access

During this step the overall access is computed for each population grid, meaning that we can already observe the BNA score spatial behavior within our study area.

12. Compute overall score for the whole study area

For this step a new table is generated in the database sa_score_inputs to store the preliminary results. The code can be accessed on the Rmd file.

Results

The overall results obtained include the final score for the whole city, as well as the score per destination category. The total population and stress network is also calculated. The results can be observed on the following table.

Score/Value
Overall Score 74.32
Population 130217
Length of Low Stress Network (km) 1286.6
Length of High Stress Network (km) 118.3
People
Total People 79.65
Opportunity
Employment 0
K-12 Education 84.47
Technical/vocational school 81.24
Higher Education 77.46
Total Opportunity 53.18
Core Services
Doctor offices/clinics 81.12
Dentist offices 78.79
Hospitals 72.68
Pharmacies 77.83
Supermarkets 87.17
Social services 84.89
Total Core Services 80.95
Retail
Total Retail shopping 81.62
Recreation
Parks 86.26
Recreational trails 95.76
Community centers 73.44
Total Recreation 86.38
Transit
Total Transit 68.97

We can plot the results to have a quick view of the output, including the high and low stress network in an interactive way.

library(sf)
pop <- st_read(
  dsn = connection,
  layer = c("generated","sa_pop_grid")
)
ways <- st_read(
  dsn = connection,
  query = "SELECT ft_seg_stress, tf_seg_stress, geom FROM received.sa_ways"
)
bna_pal <- c("#FC7151","#DC7E6A","#C98875","#C08B83","#AD9396",
             "#9C9A9F","#929EAC","#78AAC5","#6FADCB","#49BFE6")
bna_breaks <- c(6,12,18,24,30,36,42,48,54,100)
ways$ft_stress <- ifelse(ways$ft_seg_stress == 1,"low stress","high stress")
ways$tf_stress <- ifelse(ways$tf_seg_stress == 1,"low stress","high stress")
library(tmap)
tmap_mode("view")
tmap mode set to interactive viewing
int_map <- 
  tmap::tmap_leaflet(
     tmap::tm_view(
     basemaps = c(
       "CartoDB.Positron",
       "CartoDB.DarkMatter",
       "OpenStreetMap.Mapnik"
     )
   ) +
     tmap::tm_shape(pop) +
     tmap::tm_polygons(
       col = "overall_score",
       style = "fixed",
       breaks = bna_breaks,
       palette = bna_pal,
       alpha = 0.8,
       title = "BNA score",
       border.col = NULL,
       colorNA = NULL,
       showNA = FALSE
      ) +
     tmap::tm_shape(ways) +
     tmap::tm_lines(
       col = "ft_stress", 
       colorNA = NULL,
       showNA = FALSE,
       palette = c("firebrick1", "deepskyblue3"),
       title.col = "Stress network"
      ) +
     tmap::tm_shape(ways) +
     tmap::tm_lines(
       col = "tf_stress", 
       colorNA = NULL,
       showNA = FALSE,
       palette = c("firebrick1", "deepskyblue3"),
       legend.col.show = FALSE
      )
  )
int_map

Observations

  • The total time that this particular city took to compute its BNA, including plots and data download was:
Time difference of 30.40046 mins
  • What can be observd for the whole analysis is that the resulting BNA score is highly influenced by the fact that the job/employment data is not available. However, this was an attempt to reproduce the score as close as possible as PfB apply their methodology, just to explore its reproducibility.

  • My plan next is to exclude this variable from the BNA score computation, and perhaps include some other variables that would suit the European context better.

  • My final goal for the moment is to try to validate the scoring methodology for Europe. I picked a city in the UK as I know there is Origin-Destination data available that could be used as a validation method.

LS0tDQp0aXRsZTogIkJOQSBzY29yZSBmb3IgRXVyb3BlIg0Kc3VidGl0bGU6IEFuIGF0dGVtcHQgdG8gcmVwcm9kdWNlIHRoZSBQZW9wbGUgZm9yIEJpa2VzIEJOQSBzY29yZQ0KYXV0aG9yOiBMb3JlbmEgQWJhZA0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0aGVtZTogZmxhdGx5DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgZGZfcHJpbnQ6IHRpYmJsZQ0KLS0tDQpUaGUgY29kZXMgYmVsb3cgd2lsbCBhbGxvdyB0aGUgY29tcHV0YXRpb24gb2YgdGhlIFtCTkEgc2NvcmVdKGh0dHBzOi8vYm5hLnBlb3BsZWZvcmJpa2VzLm9yZy8jLykgZm9yIGFueSBjaXR5IGluIEV1cm9wZS4gVGhlIGNvZGluZyBsYW5ndWFnZXMgYXJlIGEgY29tYmluYXRpb24gb2YgUiBhbmQgU1FMLCB3aXRoIGEgZmV3IGxpbmVzIHBhc3NlZCBvbnRvIHRoZSBDb21tYW5kIFByb21wdC4NCg0KIyMgV29ya2Zsb3cgc3RlcCBieSBzdGVwDQoNCiMjIyAxLiBFc3RhYmxpc2ggYSBjb25uZWN0aW9uIHdpdGggdGhlIFBvc3RncmVTUUwgc2VydmVyIGFuZCBlc3RhYmxpc2ggYmFzaWMgcGFyYW1ldGVycyBvZiBhbmFseXNpcy4NCg0KV2l0aGluIHRoaXMgc3RlcCwgdGhyZWUgbWFqb3IgdGhpbmdzIGFyZSBwZXJmb3JtZWQsIGFzc3VtaW5nIHRoYXQgdGhlIHVzZXIgaGFzIGNyZWF0ZWQgYSBkYXRhYmFzZSBvbiBpdHMgUG9zdGdyZVNRTC4gVG8gdGVzdCBjb25uZWNpdG9uIGFuIGVtcHR5IHRhYmxlIG9uIHRoZSBkYXRhYmFzZSBjYWxsZWQgInRlc3QiIHdhcyBjcmVhdGVkIG9uIHRoZSBwdWJsaWMgc2NoZW1hLg0KDQojIyMjIC0gQ3JlYXRlIGNvbm5lY3Rpb24gYW5kIHRlc3QgaXQNCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0NCnN0YXJ0IDwtIFN5cy50aW1lKCkNCmBgYA0KDQoNCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9DQpkYl9uYW1lID0gImJuYV9ldXJvcGUiDQpsb2NhbF9ob3N0ID0gImxvY2FsaG9zdCINCnBvcnRfbnVtID0gNTQzMg0KdXNlcl9uYW1lID0gInBvc3RncmVzIg0KYGBgDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgaW5jbHVkZSA9IFRSVUV9DQpsaWJyYXJ5KFJQb3N0Z3JlU1FMKQ0KDQojIExPQUQgUE9TVEdSRVNRTCBEUklWRVINCmRyaXZlciA8LSBkYkRyaXZlcigiUG9zdGdyZVNRTCIpDQojIENSRUFURSBDT05ORUNUSU9OIFRPIFRIRSBQT1NUR1JFU1FMIERBVEFCQVNFDQojIFRIRSBDT05ORUNUSU9OIFZBUklBQkxFIFdJTEwgQkUgVVNFRCBGT1IgQUxMIEZVUlRIRVIgT1BFUkFUSU9OUw0KY29ubmVjdGlvbiA8LSBkYkNvbm5lY3QoDQogIGRyaXZlciwgDQogIGRibmFtZSA9IGRiX25hbWUsDQogIGhvc3QgPSBsb2NhbF9ob3N0LCANCiAgcG9ydCA9IHBvcnRfbnVtLA0KICB1c2VyID0gdXNlcl9uYW1lLCANCiAgcGFzc3dvcmQgPSByc3R1ZGlvYXBpOjphc2tGb3JQYXNzd29yZCgiRGF0YWJhc2UgcGFzc3dvcmQiKQ0KKQ0KDQppZmVsc2UoDQogICFkYkV4aXN0c1RhYmxlKGNvbm5lY3Rpb24sICJ0ZXN0IiksDQogICJUaGUgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2Ugd2FzIG5vdCBwb3NzaWJsZS4iLA0KICAiVGhlIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlIHdhcyBzdWNjZXNzZnVsISINCikNCg0KIyBESVNDT05ORUNUOiBJbXBvcnRhbnQgd2hlbiBtb2RpZnlpbmcgdGhlIGRhdGFiYXNlIG9uIHBnYWRtaW40DQojIGRiRGlzY29ubmVjdChjb25uZWN0aW9uKQ0KYGBgDQoNCiMjIyMgLSBTZXQgdXAgZGF0YWJhc2UNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGVjaG8gPSBUUlVFfQ0KQ1JFQVRFIEVYVEVOU0lPTiBJRiBOT1QgRVhJU1RTIGhzdG9yZTsNCkNSRUFURSBFWFRFTlNJT04gSUYgTk9UIEVYSVNUUyBwb3N0Z2lzOw0KQ1JFQVRFIEVYVEVOU0lPTiBJRiBOT1QgRVhJU1RTIHBncm91dGluZzsNCkNSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUUyBkZXN0aW5hdGlvbnM7DQpDUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFMgZ2VuZXJhdGVkOw0KQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTIHJlY2VpdmVkOw0KYGBgDQoNCiMjIyMgLSBFc3RhYmxpc2ggU3R1ZHkgQXJlYSBhbmQgb3RoZXIgaW1wb3J0YW50IHZhcmlhYmxlcw0KDQpOb3Qgb25seSB0aGUgbmFtZSBvZiB0aGUgc3R1ZHkgYXJlYSBzaG91bGQgYmUgZXN0YWJsaXNoZWQsIGJ1dCBhbHNvIHRoZSBudW1iZXIgb2Ygc3ViZGl2aXNpb25zIGZvciB0aGUgZ3JpZCwgdGhlIGNvb3JkaW5hdGUgcmVmZXJlbmNlIHN5c3RlbSB0byB3b3JrIHdpdGgsIGFuZCB0aGUgYmlraW5nIGRpc3RhbmNlIHRoYXQgd2lsbCBiZSBhc3N1bWVkIGZvciB0aGUgY29ubmVjdGl2aXR5IGFuYWx5c2lzLiANCg0KYGBge3J9DQpzYV9uYW1lID0gIkNhbWJyaWRnZSINCnN1YmRpdmlzaW9ucyA9IDQNCnNhX2NycyA9IDM4NTcNCmJpa2luZ19kaXN0YW5jZSA9IDMwMDAgIyMgaW4gbWV0ZXJzDQpwYXN0ZSgiWW91IGFyZSBydW5uaW5nIHRoZSBCTkEgc2NvcmUgZm9yIiwgc2FfbmFtZSwgIndpdGhpbiBhIGJpa2luZyBkaXN0YW5jZSBvZiIsIGJpa2luZ19kaXN0YW5jZS8xMDAwLCAia20uIikNCmBgYA0KDQojIyMgMi4gT2J0YWluIHN0dWR5IGFyZWEgYm91bmRhcnkgd2l0aCBgb3NtZGF0YWAuDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgaW5jbHVkZSA9IFRSVUV9DQojIEZVTkNUSU9OIFRPIEVYVFJBQ1QgU1RVRFkgQVJFQSBCT1VOREFSWSBXSVRIIE9TTSBBTkQgV1JJVEUgSVQgVE8gVEhFIERBVEFCQVNFDQpzYV9iYiA8LSBmdW5jdGlvbiAoc3R1ZHlfYXJlYSwgY3JzLCBjb25uKXsNCiAgIyBHRVQgREFUQSBGUk9NIE9TTQ0KICBsaWJyYXJ5KG9zbWRhdGEpDQogIGxpYnJhcnkoc2YpDQogIHN0dWR5X2FyZWFfYmIgPC0gc3R1ZHlfYXJlYSAlPiUgDQogICAgZ2V0YmIoZm9ybWF0X291dCA9ICJzZl9wb2x5Z29uIikgJT4lDQogICAgc3RfdHJhbnNmb3JtKGNycyA9IGNycykNCiAgDQogICMgREVMRVRFIEVYSVNUSU5HIEJPVU5EQVJZDQogIGxpYnJhcnkoc3FsZGYpDQogIHNxbGRmKA0KICAgICJEUk9QIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9ib3VuZGFyeSIsDQogICAgY29ubmVjdGlvbiA9IGNvbm4NCiAgKQ0KDQogICMgVVBMT0FEIEJPVU5EQVJZIFRPIFBPU1RHUkVTUUwgREFUQUJBU0UNCiAgbGlicmFyeShSUG9zdGdyZVNRTCkNCiAgZGJXcml0ZVRhYmxlKGNvbm4sIGMoInJlY2VpdmVkIiwic2FfYm91bmRhcnkiKSwgc3R1ZHlfYXJlYV9iYikNCiAgDQogIHN0dWR5X2FyZWFfYmINCn0NCg0KYm91bmRhcnkgPC0gc2FfYmIoDQogIHN0dWR5X2FyZWEgPSBzYV9uYW1lLCANCiAgY3JzID0gc2FfY3JzLCANCiAgY29ubiA9IGNvbm5lY3Rpb24NCikNCg0KbGlicmFyeSh0bWFwKQ0KdG1hcF9tb2RlKCJ2aWV3IikNCnF0bSgNCiAgc2hwID0gYm91bmRhcnksIA0KICBmaWxsID0gTlVMTCwgDQogIGJvcmRlcnMgPSAicmVkIiwgDQogIGJhc2VtYXBzID0gIk9wZW5TdHJlZXRNYXAiDQopDQpgYGANCg0KIyMjIDMuIE9idGFpbiB0aGUgYC5vc21gIGZpbGUgZnJvbSAqKk92ZXJwYXNzIEFQSSoqDQoNCmBgYHtyfQ0KIyBGVU5DVElPTiBUTyBET1dOTE9BRCBPU00gREFUQSBXSVRIIFRIRSBPVkVSUEFTUyBBUEkgDQpzYV9kb3dubG9hZCA8LSBmdW5jdGlvbihjb25uKXsNCiAgIyBPQlRBSU4gVEhFIEVYVEVOVCBPRiBUSEUgU1RVRFkgQVJFQSBBUyBBIEJPVU5ESU5HIEJPWA0KICBzYV9leHRlbnQgPC0gZGJHZXRRdWVyeShjb25uLA0KICAgICAgICAiU0VMRUNUDQogICAgICAgIFNUX0V4dGVudCgoU1RfVHJhbnNmb3JtKGdlb21ldHJ5LDQzMjYpKSkNCiAgICAgICAgRlJPTSByZWNlaXZlZC5zYV9ib3VuZGFyeSIpIA0KICANCiAgbGlicmFyeShzdHJpbmdyKQ0KICBzYV9jb29yZCA8LSB0b1N0cmluZyhzYV9leHRlbnQpICU+JSANCiAgICBzdHJfZXh0cmFjdF9hbGwoIlxcLSpcXGQrXFwuKlxcZCoiKSAlPiUgDQogICAgdW5saXN0KCkgJT4lIA0KICAgIHRvU3RyaW5nKCkNCiAgICANCiAgIyBDT05TVFJVQ1QgVEhFIEFQSSBMSU5FIFRPIFJFUVVFU1QgVEhFIERBVEENCiAgYXBpIDwtIHBhc3RlKA0KICAgICdodHRwczovL292ZXJwYXNzLWFwaS5kZS9hcGkvbWFwP2Jib3g9JywNCiAgICBzYV9jb29yZCwNCiAgICBzZXAgPSAnJw0KICApDQogIA0KICAjIENSRUFURSBBIE5FVyBURU1QT1JBTCBESVJFQ1RPUlkgVE8gRE9XTkxPQUQgVEhFIElORk8NCiAgY2QgPC0gZ2V0d2QoKQ0KICBpZmVsc2UoDQogICAgIWZpbGUuZXhpc3RzKGZpbGUucGF0aChjZCwndGVtcCcpKSwNCiAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChjZCwndGVtcCcpKSwgDQogICAgIkRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyINCiAgKQ0KICANCiAgIyBFU1RBQkxJU0ggVEhFIE5BTUUgT0YgVEhFIEZJTEUgV0hFUkUgVEhFIE9WRVJQQVNTIEFQSSBXSUxMIERPV05MT0FEIElUUyBEQVRBDQogIG9zbV9maWxlIDwtIGZpbGUucGF0aChjZCwndGVtcCcsJ292ZXJwYXNzLm9zbScpDQogIA0KICAjIFJFUVVFU1QgVEhFIERBVEEgRlJPTSBUSEUgQVBJDQogIGxpYnJhcnkodXRpbHMpDQogIGRvd25sb2FkLmZpbGUodXJsID0gYXBpLCBkZXN0ZmlsZSA9IG9zbV9maWxlLCBleHRyYSA9ICctbnYgLU8nKSANCiAgDQogIGlmZWxzZSgNCiAgICBmaWxlLmV4aXN0cyhmaWxlLnBhdGgoY2QsJ3RlbXAnLCdvdmVycGFzcy5vc20nKSksDQogICAgIk9NUyBkYXRhIHN1Y2Nlc3NmdWxseSBkb3dubG9hZGVkISIsDQogICAgIk9TTSBkYXRhIHdhcyBub3QgZG93bmxvYWRlZCwgcGxlYXNlIHRyeSBhZ2FpbiBvciBkb3dubG9hZCBtYW51YWxseS4iDQogICkNCiAgDQp9DQoNCiMgRE9XTkxPQUQgVEhFIERBVEEgRlJPTSBPU00gV0lUSCBPVkVSUEFTUyBBUEkNCnNhX2Rvd25sb2FkKGNvbm4gPSBjb25uZWN0aW9uKQ0KYGBgDQoNCiMjIyA0LiBMb2FkIGRhdGEgaW50byB0aGUgUG9zdGdyZVNRTCBkYXRhYmFzZS4gDQoNCiMjIyMgLSBPYnRhaW4gY29uZmlndXJhdGlvbiBmaWxlcw0KDQpgYGB7ciwgY29sbGFwc2UgPSBUUlVFfQ0KIyBDUkVBVEUgQSBORVcgVEVNUE9SQUwgRElSRUNUT1JZIFRPIERPV05MT0FEIFRIRSBJTkZPDQpjZCA8LSBnZXR3ZCgpDQppZmVsc2UoDQogICFmaWxlLmV4aXN0cyhmaWxlLnBhdGgoY2QsJ3RlbXAnKSksDQogIGRpci5jcmVhdGUoZmlsZS5wYXRoKGNkLCd0ZW1wJykpLCANCiAgIkRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyINCikNCg0KIyBFU1RBQkxJU0ggVEhFIE5BTUUgT0YgVEhFIEZJTEVTIA0KcGZic3R5bGVfZmlsZSA8LSBmaWxlLnBhdGgoY2QsJ3RlbXAnLCdwZmIuc3R5bGUnKQ0KbWFwY29uZmlnX2ZpbGUgPC0gZmlsZS5wYXRoKGNkLCJ0ZW1wIiwibWFwY29uZmlnLnhtbCIpDQptYXBjb25maWdiaWtlc19maWxlIDwtIGZpbGUucGF0aChjZCwidGVtcCIsIm1hcGNvbmZpZ19mb3JfYmljeWNsZXMueG1sIikNCg0KIyBDSEVDSyBJRiBUSEVZIEFSRSBET1dOTE9BREVEDQppZigNCiAgZmlsZS5leGlzdHMoZmlsZS5wYXRoKHBmYnN0eWxlX2ZpbGUpKSAmIA0KICBmaWxlLmV4aXN0cyhmaWxlLnBhdGgobWFwY29uZmlnX2ZpbGUpKSAmDQogIGZpbGUuZXhpc3RzKGZpbGUucGF0aChtYXBjb25maWdiaWtlc19maWxlKSkNCil7DQogICJGaWxlcyBhcmUgYWxyZWFkeSBkb3dubG9hZGVkISINCn0gZWxzZSB7DQogIyBFU1RBQkxJU0ggVEhFIFVSTFMNCiAgcGZic3R5bGVfdXJsIDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXphdmVhL3BmYi1uZXR3b3JrLWNvbm5lY3Rpdml0eS9kZXZlbG9wL3NyYy9hbmFseXNpcy9pbXBvcnQvcGZiLnN0eWxlIg0KICANCiAgbWFwY29uZmlnX3VybCA8LSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3BnUm91dGluZy9vc20ycGdyb3V0aW5nL21hc3Rlci9tYXBjb25maWcueG1sIg0KICANCiAgbWFwY29uZmlnYmlrZXNfdXJsIDwtIA0KICAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3BnUm91dGluZy9vc20ycGdyb3V0aW5nL21hc3Rlci9tYXBjb25maWdfZm9yX2JpY3ljbGVzLnhtbCINCiAgDQogICMgUkVRVUVTVCBUSEUgREFUQQ0KICBsaWJyYXJ5KHV0aWxzKQ0KICBkb3dubG9hZC5maWxlKHVybCA9IHBmYnN0eWxlX3VybCwgZGVzdGZpbGUgPSBwZmJzdHlsZV9maWxlKQ0KICBkb3dubG9hZC5maWxlKHVybCA9IG1hcGNvbmZpZ191cmwsIGRlc3RmaWxlID0gbWFwY29uZmlnX2ZpbGUpDQogIGRvd25sb2FkLmZpbGUodXJsID0gbWFwY29uZmlnYmlrZXNfdXJsLCBkZXN0ZmlsZSA9IG1hcGNvbmZpZ2Jpa2VzX2ZpbGUpIA0KfQ0KYGBgDQoNCg0KIyMjIyAtIExvYWQgZGF0YSB3aXRoIGBvc20ycGdzcWxgIGFuZCBgb3NtMnBncm91dGluZ2ANCg0KKipOT1RFOioqIFRvIHJ1biB0aGlzIGNvbW1hbmQgY3JlYXRlIGEgcGFzc3dvcmQgZmlsZSBvbiAlQVBQREFUQSUvcG9zdGdyZXNxbC9wZ3Bhc3MuY29uZiB3aXRoIHRoZSBmb3JtYXQgaG9zdG5hbWU6cG9ydDpkYXRhYmFzZTp1c2VybmFtZTpwYXNzd29yZA0KDQpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQ0Kc3lzdGVtKA0KICBjb21tYW5kID0gIm9zbTJwZ3NxbCAtYyAtZCBibmFfZXVyb3BlIC1VIHBvc3RncmVzIC1IIGxvY2FsaG9zdCAtVyAtLWNyZWF0ZSAtLXByZWZpeCBzYV9mdWxsIC1TIEU6L0dlb1RlY2gvVGhlc2lzL1RoZXNpc19SX1Byb2plY3QvdGVtcC9wZmIuc3R5bGUgRTovR2VvVGVjaC9UaGVzaXMvVGhlc2lzX1JfUHJvamVjdC90ZW1wL292ZXJwYXNzLm9zbSAtLWNhY2hlIDYwMCIsDQogIHNob3cub3V0cHV0Lm9uLmNvbnNvbGUgPSBUUlVFDQogICkNCg0Kc3lzdGVtKA0KICBjb21tYW5kID0gIm9zbTJwZ3JvdXRpbmcgLWYgRTovR2VvVGVjaC9UaGVzaXMvVGhlc2lzX1JfUHJvamVjdC90ZW1wL292ZXJwYXNzLm9zbSAtaCBsb2NhbGhvc3QgLWQgYm5hX2V1cm9wZSAtLXVzZXJuYW1lIHBvc3RncmVzIC0tc2NoZW1hIHJlY2VpdmVkIC0tcHJlZml4IHNhX2FsbF8gLS1jb25mIEU6L0dlb1RlY2gvVGhlc2lzL1RoZXNpc19SX1Byb2plY3QvdGVtcC9tYXBjb25maWcueG1sIC0tY2xlYW4iLA0KICBzaG93Lm91dHB1dC5vbi5jb25zb2xlID0gVFJVRQ0KKQ0KDQpzeXN0ZW0oDQogIGNvbW1hbmQgPSAib3NtMnBncm91dGluZyAtZiBFOi9HZW9UZWNoL1RoZXNpcy9UaGVzaXNfUl9Qcm9qZWN0L3RlbXAvb3ZlcnBhc3Mub3NtIC1oIGxvY2FsaG9zdCAgLWQgYm5hX2V1cm9wZSAtLXVzZXJuYW1lIHBvc3RncmVzIC0tc2NoZW1hIHJlY2VpdmVkIC0tcHJlZml4IHNhX2Jpa2VfIC0tY29uZiBFOi9HZW9UZWNoL1RoZXNpcy9UaGVzaXNfUl9Qcm9qZWN0L3RlbXAvbWFwY29uZmlnX2Zvcl9iaWN5Y2xlcy54bWwgLS1jbGVhbiIsDQogIHNob3cub3V0cHV0Lm9uLmNvbnNvbGUgPSBUUlVFDQopDQpgYGANCg0KUmVwbGFjZSB2YXJpYWJsZXMgYmV0d2VlbiBgJWA6DQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgZXZhbCA9IEZBTFNFLCBpbmNsdWRlID0gVFJVRX0NCnN5c3RlbSgNCiAgY29tbWFuZCA9ICJvc20ycGdzcWwgLWMgLWQgJURCTkFNRSUgLVUgJVVTRVJOQU1FJSAtSCAlSE9TVE5BTUUlIC1XIC0tY3JlYXRlIC0tcHJlZml4IHNhX2Z1bGwgLVMgJUNVUlJFTlRESVJFQ1RPUlkvdGVtcC9wZmIuc3R5bGUlICVDVVJSRU5URElSRUNUT1JZL3RlbXAvb3ZlcnBhc3Mub3NtJSAtLWNhY2hlIDYwMCIsDQogIHNob3cub3V0cHV0Lm9uLmNvbnNvbGUgPSBUUlVFDQogICkNCg0Kc3lzdGVtKA0KICBjb21tYW5kID0gIm9zbTJwZ3JvdXRpbmcgLWYgJUNVUlJFTlRESVJFQ1RPUlkvdGVtcC9vdmVycGFzcy5vc20lIC1oICVIT1NUTkFNRSUgLS1wYXNzd29yZCAlREJQQVNTV09SRCUgLWQgJURCTkFNRSUgLS11c2VybmFtZSAlVVNFUk5BTUUlIC0tc2NoZW1hIHJlY2VpdmVkIC0tcHJlZml4IHNhX2FsbF8gLS1jb25mICVDVVJSRU5URElSRUNUT1JZL3RlbXAvbWFwY29uZmlnLnhtbCUgLS1jbGVhbiIsDQogIHNob3cub3V0cHV0Lm9uLmNvbnNvbGUgPSBUUlVFDQopDQoNCnN5c3RlbSgNCiAgY29tbWFuZCA9ICJvc20ycGdyb3V0aW5nIC1mICVDVVJSRU5URElSRUNUT1JZL3RlbXAvb3ZlcnBhc3Mub3NtJSAtaCAlSE9TVE5BTUUlIC0tcGFzc3dvcmQgJURCUEFTU1dPUkQlIC1kICVEQk5BTUUlIC0tdXNlcm5hbWUgJVVTRVJOQU1FJSAtLXNjaGVtYSByZWNlaXZlZCAtLXByZWZpeCBzYV9iaWtlXyAtLWNvbmYgJUNVUlJFTlRESVJFQ1RPUlkvdGVtcC9tYXBjb25maWdfZm9yX2JpY3ljbGVzLnhtbCUgLS1jbGVhbiIsDQogIHNob3cub3V0cHV0Lm9uLmNvbnNvbGUgPSBUUlVFDQopDQpgYGANCg0KIyMjIDUuIE9yZ2FuaXplIGFuZCBwcmVwYXJlIHRoZSBkYXRhYmFzZSANCg0KT24gdGhpcyBzdGVwLCBzZXZlcmFsIFNRTCBxdWVyaWVzIGFyZSBiZWluZyBydW4gdG8gb3JnYW5pemUgdGhlIHRhYmxlcywgY2xpcCB0aGVtIHRvIHRoZSBzdHVkeSBhcmVhIG91dGxpbmUsIG1lcmdlIGl0IHdpdGggdGhlICpvc20ycGdzcWwqIGRhdGEgYW1vbmcgb3RoZXIgdGhpbmdzLiBUaGUgc2NyaXB0cyBpbmNsdWRlIG1haW5seSB0aGUgY29kZSB0aGF0IFBmQiBhbHJlYWR5IHVzZXMsIGJ1dCB3aXRoIHNvbWUgbW9kaWZpY2F0aW9ucyBsaWtlIGNoYW5naW5nIGZlZXQgdG8gbWV0ZXJzLCBtcGggdG8ga20vaCwgYW5kIG90aGVycy4gQmFzaWNhbGx5LCA0IHN0ZXBzIGFyZSB0YWtlbjoNCg0KIyMjIyAtIE9yZ2FuaXplIHRhYmxlcw0KDQpXaGljaCBkcm9wcyB1bnVzZWQgY29sdW1ucyBhbmQgcHJvamVjdHMgZGF0YSB0byB0aGUgYWxyZWFkeSBlc3RhYmxpc2hlZCBDUlMuIEl0IGFsc28gY2xlYW5zIHRoZSBkYXRhYmFzZSBmb3IgYSBuZXcgYW5hbHlzaXMgdG8gYmUgcnVuIGlmIHRoZSBzdHVkeSBhcmVhIGlzIGNoYW5nZWQgZm9yIGV4YW1wbGUuIA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQoNCi0tIE9SR0FOSVpFIE5FV0xZIENSRUFURUQgVEFCTEVTDQoNCi0tIGRlbGV0ZSBleGlzdGluZyB0YWJsZXMNCg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfZnVsbF9saW5lOw0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludDsNCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2Z1bGxfcG9seWdvbjsNCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2Z1bGxfcm9hZHM7DQpEUk9QIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzOw0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5c19pbnQ7DQoNCi0tIG1vdmUgdGFibGVzIHRvIHJlY2VpdmVkIHNjaGVtYQ0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHB1YmxpYy5zYV9mdWxsX2xpbmUgU0VUIFNDSEVNQSByZWNlaXZlZDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyBwdWJsaWMuc2FfZnVsbF9wb2ludCBTRVQgU0NIRU1BIHJlY2VpdmVkOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHB1YmxpYy5zYV9mdWxsX3BvbHlnb24gU0VUIFNDSEVNQSByZWNlaXZlZDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyBwdWJsaWMuc2FfZnVsbF9yb2FkcyBTRVQgU0NIRU1BIHJlY2VpdmVkOw0KDQotLSBkcm9wIHVudXNlZCB0YWJsZXMNCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF9wb2ludHNvZmludGVyZXN0Ow0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYmlrZV9wb2ludHNvZmludGVyZXN0Ow0KDQotLSBkcm9wIHVudXNlZCBjb2x1bW5zDQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHRhZ19pZDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgbGVuZ3RoOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyBsZW5ndGhfbTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgeDE7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHkxOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyB4MjsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgeTI7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGNvc3Q7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHJldmVyc2VfY29zdDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgY29zdF9zOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyByZXZlcnNlX2Nvc3RfczsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgcnVsZTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgbWF4c3BlZWRfZm9yd2FyZDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBEUk9QIENPTFVNTiBJRiBFWElTVFMgbWF4c3BlZWRfYmFja3dhcmQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHNvdXJjZV9vc207DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHRhcmdldF9vc207DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXMgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHByaW9yaXR5Ow0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyBvbmVfd2F5Ow0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIERST1AgQ09MVU1OIElGIEVYSVNUUyBvbmV3YXk7DQoNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5c192ZXJ0aWNlc19wZ3IgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGNudDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5c192ZXJ0aWNlc19wZ3IgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGNoazsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5c192ZXJ0aWNlc19wZ3IgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGVpbjsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5c192ZXJ0aWNlc19wZ3IgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGVvdXQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXNfdmVydGljZXNfcGdyIERST1AgQ09MVU1OIElGIEVYSVNUUyBsb247DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXNfdmVydGljZXNfcGdyIERST1AgQ09MVU1OIElGIEVYSVNUUyBsYXQ7DQoNCi0tIGNoYW5nZSBjb2x1bW4gbmFtZXMNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBSRU5BTUUgQ09MVU1OIGdpZCBUTyByb2FkX2lkOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIFJFTkFNRSBDT0xVTU4gdGhlX2dlb20gVE8gZ2VvbTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBSRU5BTUUgQ09MVU1OIHNvdXJjZSBUTyBpbnRlcnNlY3Rpb25fZnJvbTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5cyBSRU5BTUUgQ09MVU1OIHRhcmdldCBUTyBpbnRlcnNlY3Rpb25fdG87DQoNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9hbGxfd2F5c192ZXJ0aWNlc19wZ3IgUkVOQU1FIENPTFVNTiBpZCBUTyBpbnRfaWQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYWxsX3dheXNfdmVydGljZXNfcGdyIFJFTkFNRSBDT0xVTU4gdGhlX2dlb20gVE8gZ2VvbTsNCg0KLS0gY2hhbmdlIG5hbWVzIG9mIHRhYmxlcw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzIFJFTkFNRSBUTyBzYV93YXlzOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2FsbF93YXlzX3ZlcnRpY2VzX3BnciBSRU5BTUUgVE8gIHNhX3dheXNfaW50Ow0KDQotLSBjcmVhdGUgbmV3IGNvbHVtbnMNCg0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIGZ1bmN0aW9uYWxfY2xhc3MgVEVYVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBwYXRoX2lkIElOVEVHRVI7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgc3BlZWRfbGltaXQgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIG9uZV93YXlfY2FyIFZBUkNIQVIoMik7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgb25lX3dheSBWQVJDSEFSKDIpOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHdpZHRoIElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBmdF9iaWtlX2luZnJhIFRFWFQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgZnRfYmlrZV9pbmZyYV93aWR0aCBGTE9BVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyB0Zl9iaWtlX2luZnJhIFRFWFQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgdGZfYmlrZV9pbmZyYV93aWR0aCBGTE9BVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBmdF9sYW5lcyBJTlQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgdGZfbGFuZXMgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIGZ0X2Nyb3NzX2xhbmVzIElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyB0Zl9jcm9zc19sYW5lcyBJTlQ7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgdHdsdGxfY3Jvc3NfbGFuZXMgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIGZ0X3BhcmsgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHRmX3BhcmsgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIGZ0X3NlZ19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIGZ0X2ludF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHRmX3NlZ19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHRmX2ludF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXMgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIHh3YWxrIElOVDsNCg0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXNfaW50IEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBsZWdzIElOVDsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzX2ludCBBREQgQ09MVU1OIElGIE5PVCBFWElTVFMgc2lnbmFsaXplZCBCT09MRUFOOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXNfaW50IEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBzdG9wcyBCT09MRUFOOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXNfaW50IEFERCBDT0xVTU4gSUYgTk9UIEVYSVNUUyBycmZiIEJPT0xFQU47DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgQUREIENPTFVNTiBJRiBOT1QgRVhJU1RTIGlzbGFuZCBCT09MRUFOOw0KDQotLSBpbmRleGVzDQpEUk9QIElOREVYIElGIEVYSVNUUyByZWNlaXZlZC5pZHhfc2Ffd2F5c19vc207DQpEUk9QIElOREVYIElGIEVYSVNUUyByZWNlaXZlZC5pZHhfc2Ffd2F5c19pbnRfb3NtOw0KRFJPUCBJTkRFWCBJRiBFWElTVFMgcmVjZWl2ZWQuaWR4X3NhX2FsbF9mdWxsd2F5czsNCkRST1AgSU5ERVggSUYgRVhJU1RTIHJlY2VpdmVkLmlkeF9zYV9hbGxfZnVsbHBvaW50czsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19vc20gT04gcmVjZWl2ZWQuc2Ffd2F5cyAob3NtX2lkKTsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19pbnRfb3NtIE9OIHJlY2VpdmVkLnNhX3dheXNfaW50IChvc21faWQpOw0KQ1JFQVRFIElOREVYIGlkeF9zYV9hbGxfZnVsbHdheXMgT04gcmVjZWl2ZWQuc2FfZnVsbF9saW5lIChvc21faWQpOw0KQ1JFQVRFIElOREVYIGlkeF9zYV9hbGxfZnVsbHBvaW50cyBPTiByZWNlaXZlZC5zYV9mdWxsX3BvaW50IChvc21faWQpOw0KDQpBTkFMWVpFIHJlY2VpdmVkLnNhX3dheXMgKG9zbV9pZCxnZW9tKTsNCkFOQUxZWkUgcmVjZWl2ZWQuc2FfYmlrZV93YXlzICh0aGVfZ2VvbSk7DQpBTkFMWVpFIHJlY2VpdmVkLnNhX3dheXNfaW50IChvc21faWQpOw0KQU5BTFlaRSByZWNlaXZlZC5zYV9mdWxsX2xpbmUgKG9zbV9pZCk7DQpBTkFMWVpFIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQgKG9zbV9pZCk7DQoNCi0tIGFkZCBpbiBjeWNsZXdheSBkYXRhIHRoYXQgaXMgbWlzc2luZyBmcm9tIGZpcnN0IG9zbTJwZ3JvdXRpbmcgY2FsbA0KSU5TRVJUIElOVE8gcmVjZWl2ZWQuc2Ffd2F5cyAoDQogICAgbmFtZSwgaW50ZXJzZWN0aW9uX2Zyb20sIGludGVyc2VjdGlvbl90bywgb3NtX2lkLCBnZW9tDQopDQpTRUxFQ1QgIG5hbWUsDQogICAgICAgIChTRUxFQ1QgICAgIGkuaW50X2lkDQogICAgICAgIEZST00gICAgICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGkNCiAgICAgICAgV0hFUkUgICAgICAgaS5nZW9tIDwjPiByZWNlaXZlZC5zYV9iaWtlX3dheXMudGhlX2dlb20gPCAyMA0KICAgICAgICBPUkRFUiBCWSAgICBTVF9EaXN0YW5jZShTVF9TdGFydFBvaW50KHJlY2VpdmVkLnNhX2Jpa2Vfd2F5cy50aGVfZ2VvbSksaS5nZW9tKSBBU0MNCiAgICAgICAgTElNSVQgICAgICAgMSksDQogICAgICAgIChTRUxFQ1QgICAgIGkuaW50X2lkDQogICAgICAgIEZST00gICAgICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGkNCiAgICAgICAgV0hFUkUgICAgICAgaS5nZW9tIDwjPiByZWNlaXZlZC5zYV9iaWtlX3dheXMudGhlX2dlb20gPCAyMA0KICAgICAgICBPUkRFUiBCWSAgICBTVF9EaXN0YW5jZShTVF9FbmRQb2ludChyZWNlaXZlZC5zYV9iaWtlX3dheXMudGhlX2dlb20pLGkuZ2VvbSkgQVNDDQogICAgICAgIExJTUlUICAgICAgIDEpLA0KICAgICAgICBvc21faWQsDQogICAgICAgIHRoZV9nZW9tDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Jpa2Vfd2F5cw0KV0hFUkUgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHcyDQogICAgICAgICAgICBXSEVSRSAgIHcyLm9zbV9pZCA9IHJlY2VpdmVkLnNhX2Jpa2Vfd2F5cy5vc21faWQNCik7DQoNCkRST1AgSU5ERVggSUYgRVhJU1RTIHJlY2VpdmVkLmlkeF9zYV93YXlzX2ludHNfc3RvcDsNCkRST1AgSU5ERVggSUYgRVhJU1RTIHJlY2VpdmVkLmlkeF9zYV93YXlzX3JyZmI7DQpEUk9QIElOREVYIElGIEVYSVNUUyByZWNlaXZlZC5pZHhfc2Ffd2F5c19pc2xhbmQ7DQpDUkVBVEUgSU5ERVggaWR4X3NhX3dheXNfaW50c19zdG9wIE9OIHJlY2VpdmVkLnNhX3dheXNfaW50IChzaWduYWxpemVkLHN0b3BzKTsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19ycmZiIE9OIHJlY2VpdmVkLnNhX3dheXNfaW50IChycmZiKTsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19pc2xhbmQgT04gcmVjZWl2ZWQuc2Ffd2F5c19pbnQgKGlzbGFuZCk7DQoNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzIEFMVEVSIENPTFVNTiBnZW9tIFRZUEUgZ2VvbWV0cnkobGluZXN0cmluZyw/c2FfY3JzKQ0KVVNJTkcgU1RfVHJhbnNmb3JtKGdlb20sP3NhX2Nycyk7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfYmlrZV93YXlzIEFMVEVSIENPTFVNTiB0aGVfZ2VvbSBUWVBFIGdlb21ldHJ5KGxpbmVzdHJpbmcsP3NhX2NycykNClVTSU5HIFNUX1RyYW5zZm9ybSh0aGVfZ2VvbSw/c2FfY3JzKTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzX2ludCBBTFRFUiBDT0xVTU4gZ2VvbSBUWVBFIGdlb21ldHJ5KHBvaW50LD9zYV9jcnMpDQpVU0lORyBTVF9UcmFuc2Zvcm0oZ2VvbSw/c2FfY3JzKTsNCkFMVEVSIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV9mdWxsX2xpbmUgQUxURVIgQ09MVU1OIHdheSBUWVBFIGdlb21ldHJ5KGxpbmVzdHJpbmcsP3NhX2NycykNClVTSU5HIFNUX1RyYW5zZm9ybSh3YXksP3NhX2Nycyk7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludCBBTFRFUiBDT0xVTU4gd2F5IFRZUEUgZ2VvbWV0cnkocG9pbnQsP3NhX2NycykNClVTSU5HIFNUX1RyYW5zZm9ybSh3YXksP3NhX2Nycyk7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uIEFMVEVSIENPTFVNTiB3YXkgVFlQRSBnZW9tZXRyeShwb2x5Z29uLD9zYV9jcnMpDQpVU0lORyBTVF9UcmFuc2Zvcm0od2F5LD9zYV9jcnMpOw0KQUxURVIgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2Z1bGxfcm9hZHMgQUxURVIgQ09MVU1OIHdheSBUWVBFIGdlb21ldHJ5KGxpbmVzdHJpbmcsP3NhX2NycykNClVTSU5HIFNUX1RyYW5zZm9ybSh3YXksP3NhX2Nycyk7DQoNClNFTEVDVCAqIEZST00gcmVjZWl2ZWQuc2FfZnVsbF9yb2FkczsNCg0KYGBgDQoNCiMjIyMgLSBDbGlwIGRhdGEgaW50byBib3VuZGFyeQ0KDQpXaGljaCBjbGlwcyB0aGUgZGF0YSBpbnRvIHRoZSBib3VuZGFyeSBvZiB0aGUgc3R1ZHkgYXJlYSBzZWxlY3RlZC4NCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBEUk9QIENPTlNUUkFJTlQgSUYgRVhJU1RTIHNhX2FsbF93YXlzX3NvdXJjZV9ma2V5IENBU0NBREU7DQpBTFRFUiBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2Ffd2F5cyBEUk9QIENPTlNUUkFJTlQgSUYgRVhJU1RTIHNhX2FsbF93YXlzX3RhcmdldF9ma2V5IENBU0NBREU7DQoNCkRFTEVURSBGUk9NIHJlY2VpdmVkLnNhX3dheXNfaW50IEFTIGludGVyc2VjdGlvbnMNCiAgICBVU0lORyByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBib3VuZGFyeQ0KICAgIFdIRVJFIE5PVCBTVF9EV2l0aGluKGludGVyc2VjdGlvbnMuZ2VvbSwgYm91bmRhcnkuZ2VvbWV0cnksIDEwMDApOw0KDQpERUxFVEUgRlJPTSByZWNlaXZlZC5zYV93YXlzIEFTIHdheXMNCiAgICBVU0lORyByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBib3VuZGFyeQ0KICAgIFdIRVJFIE5PVCBTVF9EV2l0aGluKHdheXMuZ2VvbSwgYm91bmRhcnkuZ2VvbWV0cnksIDEwMDApOw0KDQpERUxFVEUgRlJPTSByZWNlaXZlZC5zYV9mdWxsX2xpbmUgQVMgbGluZXMNCiAgICBVU0lORyByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBib3VuZGFyeQ0KICAgIFdIRVJFIE5PVCBTVF9EV2l0aGluKGxpbmVzLndheSwgYm91bmRhcnkuZ2VvbWV0cnksIDEwMDApOw0KDQpERUxFVEUgRlJPTSByZWNlaXZlZC5zYV9mdWxsX3BvaW50IEFTIHBvaW50cw0KICAgIFVTSU5HIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGJvdW5kYXJ5DQogICAgV0hFUkUgTk9UIFNUX0RXaXRoaW4ocG9pbnRzLndheSwgYm91bmRhcnkuZ2VvbWV0cnksIDEwMDApOw0KDQpERUxFVEUgRlJPTSByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb24gQVMgcG9seWdvbnMNCiAgICBVU0lORyByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBib3VuZGFyeQ0KICAgIFdIRVJFIE5PVCBTVF9EV2l0aGluKHBvbHlnb25zLndheSwgYm91bmRhcnkuZ2VvbWV0cnksIDEwMDApOw0KDQpERUxFVEUgRlJPTSByZWNlaXZlZC5zYV9mdWxsX3JvYWRzIEFTIHJvYWRzDQogICAgVVNJTkcgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYm91bmRhcnkNCiAgICBXSEVSRSBOT1QgU1RfRFdpdGhpbihyb2Fkcy53YXksIGJvdW5kYXJ5Lmdlb21ldHJ5LCAxMDAwKTsNCiAgICANClNFTEVDVCAqIEZST00gcmVjZWl2ZWQuc2FfZnVsbF9yb2FkczsNCmBgYA0KDQojIyMjIC0gUG9wdWxhdGUgd2F5IHRhYmxlDQoNCldoaWNoIGRvZXMgbW9kaWZpY2F0aW9ucyB0byB0aGUgZm9sbG93aW5nIGNvbHVtbnMgb24gdGhlIHdheXMgdGFibGU6DQoNCiMjIyMjID4gb25lIHdheQ0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBvbmVfd2F5X2NhciA9IE5VTEw7DQoNCi0tIGZ0IGRpcmVjdGlvbg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIG9uZV93YXlfY2FyID0gJ2Z0Jw0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICB0cmltKG9zbS5vbmV3YXkpIElOICgnMScsJ3llcycpOw0KDQotLSB0ZiBkaXJlY3Rpb24NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBvbmVfd2F5X2NhciA9ICd0ZicNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgdHJpbShvc20ub25ld2F5KSA9ICctMSc7DQoNCmBgYA0KDQojIyMjIyA+IHdpZHRoDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgd2lkdGggPSBOVUxMOw0KDQotLSBmZWV0DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgd2lkdGggPSBzdWJzdHJpbmcob3NtLndpZHRoIGZyb20gJ1xkK1wuP1xkP1xkPycpOjpGTE9BVC8zLjI4MDg0DQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9zbS53aWR0aCBJUyBOT1QgTlVMTA0KQU5EICAgICBvc20ud2lkdGggTElLRSAnJSBmdCc7DQoNCi0tIG1ldGVycw0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIHdpZHRoID0gc3Vic3RyaW5nKG9zbS53aWR0aCBmcm9tICdcZCtcLj9cZD9cZD8nKTo6RkxPQVQNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgb3NtLndpZHRoIElTIE5PVCBOVUxMDQpBTkQgICAgIG9zbS53aWR0aCBMSUtFICclIG0nOw0KDQotLSBubyB1bml0cyAoZGVmYXVsdD1tZXRlcnMpDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgd2lkdGggPSBzdWJzdHJpbmcob3NtLndpZHRoIGZyb20gJ1xkK1wuP1xkP1xkPycpOjpGTE9BVA0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvc20ud2lkdGggSVMgTk9UIE5VTEwNCkFORCAgICAgc3Vic3RyaW5nKG9zbS53aWR0aCBmcm9tICdcZCtcLj9cZD9cZD8nKTo6RkxPQVQgPCAyMDsNCg0KLS0gVGhpbmdzIGNoYW5nZWQ6IEknZCByYXRoZXIgaGF2ZSB3aWR0aCBpbiBtZXRlcnMsIHNvIEkgY2hhbmdlZCBhbGwgdGhlIGNvbnZlcnNpb24gZmFjdG9ycy4NCmBgYA0KDQojIyMjIyA+IGZ1bmN0aW9uYWwgY2xhc3MNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdW5jdGlvbmFsX2NsYXNzID0gTlVMTDsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ1bmN0aW9uYWxfY2xhc3MgPSBvc20uaGlnaHdheQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvc20uaGlnaHdheSBJTiAoDQogICAgICAgICAgICAnbW90b3J3YXknLA0KICAgICAgICAgICAgJ3RlcnRpYXJ5JywNCiAgICAgICAgICAgICd0cnVuaycsDQogICAgICAgICAgICAndGVydGlhcnlfbGluaycsDQogICAgICAgICAgICAnbW90b3J3YXlfbGluaycsDQogICAgICAgICAgICAnc2Vjb25kYXJ5X2xpbmsnLA0KICAgICAgICAgICAgJ3ByaW1hcnlfbGluaycsDQogICAgICAgICAgICAndHJ1bmtfbGluaycsDQogICAgICAgICAgICAndW5jbGFzc2lmaWVkJywNCiAgICAgICAgICAgICdyZXNpZGVudGlhbCcsDQogICAgICAgICAgICAnc2Vjb25kYXJ5JywNCiAgICAgICAgICAgICdwcmltYXJ5JywNCiAgICAgICAgICAgICdsaXZpbmdfc3RyZWV0Jw0KKTsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAndHJhY2snDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9zbS5oaWdod2F5ID0gJ3RyYWNrJw0KQU5EICAgICBvc20udHJhY2t0eXBlID0gJ2dyYWRlMSc7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdW5jdGlvbmFsX2NsYXNzID0gJ3BhdGgnDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9zbS5oaWdod2F5IElOICgnY3ljbGV3YXknLCdwYXRoJyk7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdW5jdGlvbmFsX2NsYXNzID0gJ3BhdGgnLA0KICAgICAgICB4d2FsayA9IDENCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgb3NtLmhpZ2h3YXkgPSAnZm9vdHdheScNCkFORCAgICAgb3NtLmZvb3R3YXkgPSAnY3Jvc3NpbmcnOw0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdwYXRoJw0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvc20uaGlnaHdheSA9ICdmb290d2F5Jw0KQU5EICAgICBvc20uYmljeWNsZSA9ICdkZXNpZ25hdGVkJw0KQU5EICAgICAob3NtLmFjY2VzcyBJUyBOVUxMIE9SIG9zbS5hY2Nlc3MgTk9UIElOICgnbm8nLCdwcml2YXRlJykpDQpBTkQgICAgIENPQUxFU0NFKHJlY2VpdmVkLnNhX3dheXMud2lkdGgsMCkgPj0gODsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAncGF0aCcNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgb3NtLmhpZ2h3YXk9J3NlcnZpY2UnDQpBTkQgICAgIG9zbS5iaWN5Y2xlPSdkZXNpZ25hdGVkJzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAnbGl2aW5nX3N0cmVldCcNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgb3NtLmhpZ2h3YXkgPSAncGVkZXN0cmlhbicNCkFORCAgICAgb3NtLmJpY3ljbGUgSU4gKCd5ZXMnLCdwZXJtaXNzaXZlJywgJ2Rlc2lnbmF0ZWQnKQ0KQU5EICAgICAob3NtLmFjY2VzcyBJUyBOVUxMIE9SIG9zbS5hY2Nlc3MgTk9UIElOICgnbm8nLCdwcml2YXRlJykpOw0KDQotLSByZW1vdmUgc3R1ZmYgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHJvdXRlIG92ZXINCkRFTEVURSBGUk9NIHJlY2VpdmVkLnNhX3dheXMgV0hFUkUgZnVuY3Rpb25hbF9jbGFzcyBJUyBOVUxMOw0KDQotLSByZW1vdmUgb3JwaGFucw0KREVMRVRFIEZST00gcmVjZWl2ZWQuc2Ffd2F5cw0KV0hFUkUgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHcNCiAgICAgICAgICAgIFdIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5pbnRlcnNlY3Rpb25fdG8gSU4gKHcuaW50ZXJzZWN0aW9uX3RvLHcuaW50ZXJzZWN0aW9uX2Zyb20pDQogICAgICAgICAgICBBTkQgICAgIHcucm9hZF9pZCAhPSByZWNlaXZlZC5zYV93YXlzLnJvYWRfaWQNCikNCkFORCAgICAgTk9UIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyB3DQogICAgICAgICAgICBXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMuaW50ZXJzZWN0aW9uX2Zyb20gSU4gKHcuaW50ZXJzZWN0aW9uX3RvLHcuaW50ZXJzZWN0aW9uX2Zyb20pDQogICAgICAgICAgICBBTkQgICAgIHcucm9hZF9pZCAhPSByZWNlaXZlZC5zYV93YXlzLnJvYWRfaWQNCik7DQoNCi0tIHJlbW92ZSBvYnNvbGV0ZSBpbnRlcnNlY3Rpb25zDQpERUxFVEUgRlJPTSByZWNlaXZlZC5zYV93YXlzX2ludA0KV0hFUkUgTk9UIEVYSVNUUyAoDQogICAgU0VMRUNUICAxDQogICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHcNCiAgICBXSEVSRSAgIGludF9pZCBJTiAody5pbnRlcnNlY3Rpb25fdG8sdy5pbnRlcnNlY3Rpb25fZnJvbSkNCik7DQoNCmBgYA0KDQojIyMjIyA+IHBhdGhzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZ2VuZXJhdGVkLnNhX3BhdGhzOw0KRFJPUCBJTkRFWCBJRiBFWElTVFMgcmVjZWl2ZWQuaWR4X3NhX3dheXNfcGF0aF9pZDsNCg0KQ1JFQVRFIFRBQkxFIGdlbmVyYXRlZC5zYV9wYXRocyAoDQogICAgcGF0aF9pZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgZ2VvbSBnZW9tZXRyeShtdWx0aWxpbmVzdHJpbmcsID9zYV9jcnMpLA0KICAgIHJvYWRfaWRzIElOVEVHRVJbXSwNCiAgICBwYXRoX2xlbmd0aCBJTlRFR0VSLA0KICAgIGJib3hfbGVuZ3RoIElOVEVHRVINCik7DQoNCi0tIGNvbWJpbmUgY29udGlndW91cyBwYXRocw0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3BhdGhzIChnZW9tKQ0KU0VMRUNUICBTVF9Db2xsZWN0aW9uRXh0cmFjdCgNCiAgICAgICAgICAgIFNUX1NldFNSSUQoDQogICAgICAgICAgICAgICAgdW5uZXN0KFNUX0NsdXN0ZXJJbnRlcnNlY3RpbmcoZ2VvbSkpLA0KICAgICAgICAgICAgICAgID9zYV9jcnMNCiAgICAgICAgICAgICksDQogICAgICAgICAgICAyICAgLS1saW5lc3RyaW5ncw0KICAgICAgICApDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdwYXRoJzsNCg0KLS0gZ2V0IHJhdyBsZW5ndGhzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wYXRocw0KU0VUICAgICBwYXRoX2xlbmd0aCA9IFNUX0xlbmd0aChnZW9tKTsNCg0KLS0gZ2V0IGJvdW5kaW5nIGJveCBsZW5ndGhzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wYXRocw0KU0VUICAgICBiYm94X2xlbmd0aCA9IFNUX0xlbmd0aCgNCiAgICAgICAgICAgIFNUX1NldFNSSUQoDQogICAgICAgICAgICAgICAgU1RfTWFrZUxpbmUoDQogICAgICAgICAgICAgICAgICAgIFNUX01ha2VQb2ludChTVF9YTWluKGdlb20pLCBTVF9ZTWluKGdlb20pKSwNCiAgICAgICAgICAgICAgICAgICAgU1RfTWFrZVBvaW50KFNUX1hNYXgoZ2VvbSksIFNUX1lNYXgoZ2VvbSkpDQogICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICA/c2FfY3JzDQogICAgICAgICAgICApDQogICAgICAgICk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9wYXRoc19nZW9tIE9OIGdlbmVyYXRlZC5zYV9wYXRocyBVU0lORyBHSVNUIChnZW9tKTsNCkFOQUxZWkUgZ2VuZXJhdGVkLnNhX3BhdGhzIChnZW9tKTsNCg0KLS0gc2V0IHBhdGhfaWQgb24gZWFjaCByb2FkIHNlZ21lbnQgKGlmIHBhdGgpDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgcGF0aF9pZCA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgcGF0aHMucGF0aF9pZA0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcGF0aHMgcGF0aHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhyZWNlaXZlZC5zYV93YXlzLmdlb20scGF0aHMuZ2VvbSkNCiAgICAgICAgICAgIEFORCAgICAgU1RfQ292ZXJlZEJ5KHJlY2VpdmVkLnNhX3dheXMuZ2VvbSxwYXRocy5nZW9tKQ0KICAgICAgICAgICAgTElNSVQgICAxDQogICAgICAgICkNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdwYXRoJzsNCg0KLS0gZ2V0IHN0cmFnZ2xlcnMNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBwYXRoX2lkID0gcGF0aHMucGF0aF9pZA0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcGF0aHMgcGF0aHMNCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5mdW5jdGlvbmFsX2NsYXNzID0gJ3BhdGgnDQpBTkQgICAgIHJlY2VpdmVkLnNhX3dheXMucGF0aF9pZCBJUyBOVUxMDQpBTkQgICAgIFNUX0ludGVyc2VjdHMocmVjZWl2ZWQuc2Ffd2F5cy5nZW9tLHBhdGhzLmdlb20pDQpBTkQgICAgIFNUX0NvdmVyZWRCeShyZWNlaXZlZC5zYV93YXlzLmdlb20sU1RfQnVmZmVyKHBhdGhzLmdlb20sMSkpOw0KDQotLSBzZXQgaW5kZXgNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19wYXRoX2lkIE9OIHJlY2VpdmVkLnNhX3dheXMgKHBhdGhfaWQpOw0KQU5BTFlaRSByZWNlaXZlZC5zYV93YXlzIChwYXRoX2lkKTsNCg0KLS0gc2V0IHJvYWRfaWRzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wYXRocw0KU0VUICAgICByb2FkX2lkcyA9IGFycmF5KCgNCiAgICAgICAgICAgIFNFTEVDVCAgcm9hZF9pZA0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzDQogICAgICAgICAgICBXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMucGF0aF9pZCA9IGdlbmVyYXRlZC5zYV9wYXRocy5wYXRoX2lkDQogICAgICAgICkpOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIGFpZHhfc2FfcGF0aHNfcm9hZF9pZHMgT04gZ2VuZXJhdGVkLnNhX3BhdGhzIFVTSU5HIEdJTiAocm9hZF9pZHMpOw0KQU5BTFlaRSBnZW5lcmF0ZWQuc2FfcGF0aHMgKHJvYWRfaWRzKTsNCg0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcGF0aHM7DQpgYGANCg0KIyMjIyMgPiBzcGVlZCBsaW1pdA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIHNwZWVkX2xpbWl0ID0gTlVMTDsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIHNwZWVkX2xpbWl0ID0gc3Vic3RyaW5nKG9zbS5tYXhzcGVlZCBmcm9tICdcZCsnKTo6SU5UDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkOw0KDQotLSBUaGluZ3MgY2hhbmdlZDpyZW1vdmVkIGxhc3QgbGluZSB3aGVyZSB0aGV5IHByb21wdGVkIGZvciBzcGVlZHMgaW4gbXBoLg0KYGBgDQoNCiMjIyMjID4gbGFuZXMNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9sYW5lcyA9IE5VTEwsIHRmX2xhbmVzID0gTlVMTCwgZnRfY3Jvc3NfbGFuZXMgPSBOVUxMLCB0Zl9jcm9zc19sYW5lcyA9IE5VTEw7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9sYW5lcyA9DQogICAgICAgICAgICBDQVNFICAgIFdIRU4gb3NtLiJ0dXJuOmxhbmVzOmZvcndhcmQiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIGFycmF5X2xlbmd0aCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9zcGxpdF90b19hcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc20uInR1cm46bGFuZXM6Zm9yd2FyZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcfCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIC0tIG9ubHkgb25lIGRpbWVuc2lvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJ0dXJuOmxhbmVzIiBJUyBOT1QgTlVMTCBBTkQgcmVjZWl2ZWQuc2Ffd2F5cy5vbmVfd2F5X2NhciA9ICdmdCcNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgYXJyYXlfbGVuZ3RoKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhwX3NwbGl0X3RvX2FycmF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zbS4idHVybjpsYW5lcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcfCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIC0tIG9ubHkgb25lIGRpbWVuc2lvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJsYW5lczpmb3J3YXJkIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBzdWJzdHJpbmcob3NtLiJsYW5lczpmb3J3YXJkIiBGUk9NICdcXGQrJyk6OklOVA0KICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4ibGFuZXMiIElTIE5PVCBOVUxMIEFORCByZWNlaXZlZC5zYV93YXlzLm9uZV93YXlfY2FyID0gJ2Z0Jw0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBzdWJzdHJpbmcob3NtLiJsYW5lcyIgRlJPTSAnXFxkKycpOjpJTlQNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImxhbmVzIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBjZWlsKHN1YnN0cmluZyhvc20uImxhbmVzIiBGUk9NICdcXGQrJyk6OkZMT0FUIC8gMikNCiAgICAgICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICB0Zl9sYW5lcyA9DQogICAgICAgICAgICAgICAgICAgIENBU0UgICAgV0hFTiBvc20uInR1cm46bGFuZXM6YmFja3dhcmQiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgYXJyYXlfbGVuZ3RoKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHBfc3BsaXRfdG9fYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc20uInR1cm46bGFuZXM6YmFja3dhcmQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcfCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAtLSBvbmx5IG9uZSBkaW1lbnNpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInR1cm46bGFuZXMiIElTIE5PVCBOVUxMIEFORCByZWNlaXZlZC5zYV93YXlzLm9uZV93YXlfY2FyID0gJ3RmJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIGFycmF5X2xlbmd0aCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhwX3NwbGl0X3RvX2FycmF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NtLiJ0dXJuOmxhbmVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXHwnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgLS0gb25seSBvbmUgZGltZW5zaW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJsYW5lczpiYWNrd2FyZCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBzdWJzdHJpbmcob3NtLiJsYW5lczpiYWNrd2FyZCIgRlJPTSAnXFxkKycpOjpJTlQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4ibGFuZXMiIElTIE5PVCBOVUxMIEFORCByZWNlaXZlZC5zYV93YXlzLm9uZV93YXlfY2FyID0gJ3RmJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIHN1YnN0cmluZyhvc20uImxhbmVzIiBGUk9NICdcXGQrJyk6OklOVA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJsYW5lcyIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBjZWlsKHN1YnN0cmluZyhvc20uImxhbmVzIiBGUk9NICdcXGQrJyk6OkZMT0FUIC8gMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIGZ0X2Nyb3NzX2xhbmVzID0NCiAgICAgICAgICAgIENBU0UgICAgV0hFTiBvc20uInR1cm46bGFuZXM6Zm9yd2FyZCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgYXJyYXlfbGVuZ3RoKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfcmVtb3ZlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9zcGxpdF90b19hcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NtLiJ0dXJuOmxhbmVzOmZvcndhcmQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFx8Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JpZ2h0JyAgICAgLS0gZG9uJ3QgY29uc2lkZXIgcmlnaHQtb25seSBsYW5lcyBmb3IgY3Jvc3Npbmcgc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgIC0tIG9ubHkgb25lIGRpbWVuc2lvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJ0dXJuOmxhbmVzIiBJUyBOT1QgTlVMTCBBTkQgcmVjZWl2ZWQuc2Ffd2F5cy5vbmVfd2F5X2NhciA9ICdmdCcNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgYXJyYXlfbGVuZ3RoKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfcmVtb3ZlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9zcGxpdF90b19hcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NtLiJ0dXJuOmxhbmVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcfCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaWdodCcgICAgIC0tIGRvbid0IGNvbnNpZGVyIHJpZ2h0LW9ubHkgbGFuZXMgZm9yIGNyb3NzaW5nIHN0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAtLSBvbmx5IG9uZSBkaW1lbnNpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4ibGFuZXM6Zm9yd2FyZCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgc3Vic3RyaW5nKG9zbS4ibGFuZXM6Zm9yd2FyZCIgRlJPTSAnXFxkKycpOjpJTlQNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImxhbmVzIiBJUyBOT1QgTlVMTCBBTkQgcmVjZWl2ZWQuc2Ffd2F5cy5vbmVfd2F5X2NhciA9ICdmdCcNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgc3Vic3RyaW5nKG9zbS4ibGFuZXMiIEZST00gJ1xcZCsnKTo6SU5UDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJsYW5lcyIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgY2VpbChzdWJzdHJpbmcob3NtLiJsYW5lcyIgRlJPTSAnXFxkKycpOjpGTE9BVCAvIDIpDQogICAgICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgdGZfY3Jvc3NfbGFuZXMgPQ0KICAgICAgICAgICAgQ0FTRSAgICBXSEVOIG9zbS4idHVybjpsYW5lczpiYWNrd2FyZCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgYXJyYXlfbGVuZ3RoKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfcmVtb3ZlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9zcGxpdF90b19hcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NtLiJ0dXJuOmxhbmVzOmJhY2t3YXJkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcfCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaWdodCcgICAgIC0tIGRvbid0IGNvbnNpZGVyIHJpZ2h0LW9ubHkgbGFuZXMgZm9yIGNyb3NzaW5nIHN0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAtLSBvbmx5IG9uZSBkaW1lbnNpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4idHVybjpsYW5lcyIgSVMgTk9UIE5VTEwgQU5EIHJlY2VpdmVkLnNhX3dheXMub25lX3dheV9jYXIgPSAndGYnDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIGFycmF5X2xlbmd0aCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3JlbW92ZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHBfc3BsaXRfdG9fYXJyYXkoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zbS4idHVybjpsYW5lcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXHwnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmlnaHQnICAgICAtLSBkb24ndCBjb25zaWRlciByaWdodC1vbmx5IGxhbmVzIGZvciBjcm9zc2luZyBzdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgLS0gb25seSBvbmUgZGltZW5zaW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImxhbmVzOmJhY2t3YXJkIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBzdWJzdHJpbmcob3NtLiJsYW5lczpiYWNrd2FyZCIgRlJPTSAnXFxkKycpOjpJTlQNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImxhbmVzIiBJUyBOT1QgTlVMTCBBTkQgcmVjZWl2ZWQuc2Ffd2F5cy5vbmVfd2F5X2NhciA9ICd0ZicNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgc3Vic3RyaW5nKG9zbS4ibGFuZXMiIEZST00gJ1xcZCsnKTo6SU5UDQogICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJsYW5lcyIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgY2VpbChzdWJzdHJpbmcob3NtLiJsYW5lcyIgRlJPTSAnXFxkKycpOjpGTE9BVCAvIDIpDQogICAgICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgdHdsdGxfY3Jvc3NfbGFuZXMgPQ0KICAgICAgICAgICAgQ0FTRSAgICBXSEVOIG9zbS4ibGFuZXM6Ym90aF93YXlzIiBJUyBOT1QgTlVMTCBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInR1cm46bGFuZXM6Ym90aF93YXlzIiBJUyBOT1QgTlVMTCBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgRUxTRSBOVUxMDQogICAgICAgICAgICAgICAgICAgIEVORA0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZDsNCg0KLS0gVGhpbmdzIGNoYW5nZWQ6IFRoZSBvcmlnaW5hbCBxdWVyeSB1c2VkIG9uZV93YXkgY29sdW1uLCBidXQgdGhhdCBvbmUgaXMgbm90IHBvcHVsYXRlZCB5ZXQsIHNvIEkgY2hhbmdlZCBpdCB0byBvbmVfd2F5X2Nhcg0KYGBgDQoNCiMjIyMjID4gcGFyaw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9wYXJrID0gTlVMTCwgdGZfcGFyayA9IE5VTEw7DQoNCi0tIGJvdGgNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9wYXJrID0gQ0FTRSAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpib3RoIiA9ICdwYXJhbGxlbCcgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmJvdGgiID0gJ3BhcmFsZWxsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6Ym90aCIgPSAnZGlhZ29uYWwnIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpib3RoIiA9ICdwZXJwZW5kaWN1bGFyJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6Ym90aCIgPSAnbm9fcGFya2luZycgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmJvdGgiID0gJ25vX3N0b3BwaW5nJyBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgdGZfcGFyayA9IENBU0UgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6Ym90aCIgPSAncGFyYWxsZWwnIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpib3RoIiA9ICdwYXJhbGVsbCcgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmJvdGgiID0gJ2RpYWdvbmFsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6Ym90aCIgPSAncGVycGVuZGljdWxhcicgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmJvdGgiID0gJ25vX3BhcmtpbmcnIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpib3RoIiA9ICdub19zdG9wcGluZycgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQ7DQoNCi0tIHJpZ2h0DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnRfcGFyayA9IENBU0UgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6cmlnaHQiID0gJ3BhcmFsbGVsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6cmlnaHQiID0gJ3BhcmFsZWxsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6cmlnaHQiID0gJ2RpYWdvbmFsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6cmlnaHQiID0gJ3BlcnBlbmRpY3VsYXInIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpyaWdodCIgPSAnbm9fcGFya2luZycgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOnJpZ2h0IiA9ICdub19zdG9wcGluZycgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQ7DQoNCi0tIGxlZnQNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICB0Zl9wYXJrID0gQ0FTRSAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpsZWZ0IiA9ICdwYXJhbGxlbCcgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmxlZnQiID0gJ3BhcmFsZWxsJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6bGVmdCIgPSAnZGlhZ29uYWwnIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uInBhcmtpbmc6bGFuZTpsZWZ0IiA9ICdwZXJwZW5kaWN1bGFyJyBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJwYXJraW5nOmxhbmU6bGVmdCIgPSAnbm9fcGFya2luZycgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4icGFya2luZzpsYW5lOmxlZnQiID0gJ25vX3N0b3BwaW5nJyBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX2xpbmUgb3NtDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZDsNCg0KYGBgDQoNCiMjIyMjID4gYmlrZSBpbmZyYXN0cnVjdHVyZQ0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIGZ0X2Jpa2VfaW5mcmEgPSBOVUxMLCB0Zl9iaWtlX2luZnJhID0gTlVMTDsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gZnQgZGlyZWN0aW9uDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnRfYmlrZV9pbmZyYSA9IENBU0UNCg0KICAgICAgICAgICAgLS0gOmJvdGgNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdzaGFyZWRfbGFuZScNCiAgICAgICAgICAgICAgICBUSEVOICdzaGFycm93Jw0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmJvdGgiID0gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpib3RoOmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmJvdGgiID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgIFdIRU4gKG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ3RyYWNrJyBBTkQgb3NtLiJvbmV3YXk6YmljeWNsZSIgPSAnbm8nKQ0KICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgV0hFTiAob3NtLiJjeWNsZXdheTpsZWZ0IiA9ICd0cmFjaycgQU5EIG9zbS4ib25ld2F5OmJpY3ljbGUiID0gJ25vJykNCiAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgIFdIRU4gKG9zbS5jeWNsZXdheSA9ICd0cmFjaycgQU5EIG9zbS4ib25ld2F5OmJpY3ljbGUiID0gJ25vJykNCiAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCg0KICAgICAgICAgICAgLS0gb25lLXdheT1mdA0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciA9ICdmdCcNCiAgICAgICAgICAgICAgICBUSEVOIENBU0UgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3NoYXJyb3cnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2xhbmUnIEFORCBvc20uImN5Y2xld2F5OmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6bGVmdDpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHN0dWZmIGZyb20gdHdvLXdheSB0aGF0IGFsc28gYXBwbGllcyB0byBvbmUtd2F5PWZ0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3NoYXJyb3cnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdzaGFyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnc2hhcnJvdycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpyaWdodDpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5IiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgIC0tIG9uZS13YXk9dGYNCiAgICAgICAgICAgIFdIRU4gb25lX3dheV9jYXIgPSAndGYnDQogICAgICAgICAgICAgICAgVEhFTiBDQVNFICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnb3Bwb3NpdGVfbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnb3Bwb3NpdGVfbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnb3Bwb3NpdGVfbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6cmlnaHQ6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ29wcG9zaXRlX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdvcHBvc2l0ZV9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdsYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheSIgPSAnb3Bwb3NpdGVfdHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gKG9uZV93YXlfY2FyID0gJ3RmJyBBTkQgb3NtLiJjeWNsZXdheTpsZWZ0IiA9ICdvcHBvc2l0ZV90cmFjaycpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gKG9uZV93YXlfY2FyID0gJ3RmJyBBTkQgb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnb3Bwb3NpdGVfdHJhY2snKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgLS0gdHdvLXdheQ0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciBJUyBOVUxMDQogICAgICAgICAgICAgICAgVEhFTiBDQVNFICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3NoYXJyb3cnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdzaGFyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnc2hhcnJvdycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpyaWdodDpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5IiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICBFTkQsDQoNCiAgICAgICAgdGZfYmlrZV9pbmZyYSA9IENBU0UNCg0KICAgICAgICAgICAgLS0gOmJvdGgNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdzaGFyZWRfbGFuZScNCiAgICAgICAgICAgICAgICBUSEVOICdzaGFycm93Jw0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmJvdGgiID0gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpib3RoOmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmJvdGgiID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoIiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgIFdIRU4gKG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ3RyYWNrJyBBTkQgb3NtLiJvbmV3YXk6YmljeWNsZSIgPSAnbm8nKQ0KICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgV0hFTiAob3NtLiJjeWNsZXdheTpsZWZ0IiA9ICd0cmFjaycgQU5EIG9zbS4ib25ld2F5OmJpY3ljbGUiID0gJ25vJykNCiAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgIFdIRU4gKG9zbS5jeWNsZXdheSA9ICd0cmFjaycgQU5EIG9zbS4ib25ld2F5OmJpY3ljbGUiID0gJ25vJykNCiAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCg0KICAgICAgICAgICAgLS0gb25lLXdheT10Zg0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciA9ICd0ZicNCiAgICAgICAgICAgICAgICBUSEVOIENBU0UgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ3NoYXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdzaGFycm93Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6cmlnaHQ6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpyaWdodCIgPSAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHN0dWZmIGZyb20gdHdvLXdheSB0aGF0IGFsc28gYXBwbGllcyB0byBvbmUtd2F5PXRmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3NoYXJyb3cnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ3NoYXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdzaGFycm93Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpsZWZ0IiA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2xhbmUnIEFORCBvc20uImN5Y2xld2F5OmxlZnQ6YnVmZmVyIiBJTiAoJ3llcycsJ2JvdGgnLCdyaWdodCcsJ2xlZnQnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdidWZmZXJlZF9sYW5lJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gb3NtLmN5Y2xld2F5ID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5IiA9ICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgLS0gb25lLXdheT1mdA0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciA9ICdmdCcNCiAgICAgICAgICAgICAgICBUSEVOIENBU0UgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdvcHBvc2l0ZV9sYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdvcHBvc2l0ZV9sYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdvcHBvc2l0ZV9sYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpyaWdodDpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnb3Bwb3NpdGVfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQiID0gJ29wcG9zaXRlX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5IiA9ICdvcHBvc2l0ZV90cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiAob25lX3dheV9jYXIgPSAndGYnIEFORCBvc20uImN5Y2xld2F5OmxlZnQiID0gJ29wcG9zaXRlX3RyYWNrJykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiAob25lX3dheV9jYXIgPSAndGYnIEFORCBvc20uImN5Y2xld2F5OnJpZ2h0IiA9ICdvcHBvc2l0ZV90cmFjaycpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAtLSB0d28td2F5DQogICAgICAgICAgICBXSEVOIG9uZV93YXlfY2FyIElTIE5VTEwNCiAgICAgICAgICAgICAgICBUSEVOIENBU0UgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdzaGFyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnc2hhcnJvdycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAnc2hhcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3NoYXJyb3cnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS5jeWNsZXdheSA9ICdsYW5lJyBBTkQgb3NtLiJjeWNsZXdheTpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQiID0gJ2xhbmUnIEFORCBvc20uImN5Y2xld2F5OmJ1ZmZlciIgSU4gKCd5ZXMnLCdib3RoJywncmlnaHQnLCdsZWZ0JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAnbGFuZScgQU5EIG9zbS4iY3ljbGV3YXk6bGVmdDpidWZmZXIiIElOICgneWVzJywnYm90aCcsJ3JpZ2h0JywnbGVmdCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ2J1ZmZlcmVkX2xhbmUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBvc20uY3ljbGV3YXkgPSAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnbGFuZScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXkiID0gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICd0cmFjaycNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdCIgPSAndHJhY2snDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gJ3RyYWNrJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgRU5EDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkOw0KDQotLSB1cGRhdGUgb25lX3dheSBiYXNlZCBvbiBiaWtlIGluZnJhDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgb25lX3dheSA9IE5VTEw7DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgb25lX3dheSA9IG9uZV93YXlfY2FyDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9uZV93YXlfY2FyID0gJ2Z0Jw0KQU5EICAgICBOT1QgKHRmX2Jpa2VfaW5mcmEgSVMgTk9UIE5VTEwgT1IgQ09BTEVTQ0Uob3NtLiJvbmV3YXk6YmljeWNsZSIsJ3llcycpID0gJ25vJyk7DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgb25lX3dheSA9IG9uZV93YXlfY2FyDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9uZV93YXlfY2FyID0gJ3RmJw0KQU5EICAgICBOT1QgKGZ0X2Jpa2VfaW5mcmEgSVMgTk9UIE5VTEwgT1IgQ09BTEVTQ0Uob3NtLiJvbmV3YXk6YmljeWNsZSIsJ3llcycpID0gJ25vJyk7DQoNCi0tIGdldCBmYWNpbGl0eSB3aWR0aHMNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9iaWtlX2luZnJhX3dpZHRoID0gQ0FTRQ0KDQogICAgICAgICAgICAtLSBmZWV0DQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQ6d2lkdGgiIExJS0UgJyUgZnQnDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FULzMuMjgwODQNCiAgICAgICAgICAgIFdIRU4gb25lX3dheV9jYXIgPSAnZnQnIEFORCBvc20uImN5Y2xld2F5OmxlZnQ6d2lkdGgiIExJS0UgJyUgZnQnDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmxlZnQ6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQvMy4yODA4NA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmJvdGg6d2lkdGgiIExJS0UgJyUgZnQnDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmJvdGg6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQvMy4yODA4NA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OndpZHRoIiBMSUtFICclIGZ0Jw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVC8zLjI4MDg0DQoNCiAgICAgICAgICAgIC0tIG1ldGVycw0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBMSUtFICclIG0nDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FUDQogICAgICAgICAgICBXSEVOIG9uZV93YXlfY2FyID0gJ2Z0JyBBTkQgb3NtLiJjeWNsZXdheTpsZWZ0OndpZHRoIiBMSUtFICclIG0nDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmxlZnQ6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoOndpZHRoIiBMSUtFICclIG0nDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmJvdGg6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTp3aWR0aCIgTElLRSAnJSBtJw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KDQogICAgICAgICAgICAtLSBubyB1bml0cyAoZGVmYXVsdD1tZXRlcnMpDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6cmlnaHQ6d2lkdGgiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FUDQogICAgICAgICAgICBXSEVOIG9uZV93YXlfY2FyID0gJ2Z0JyBBTkQgb3NtLiJjeWNsZXdheTpsZWZ0OndpZHRoIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTpsZWZ0OndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FUDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6Ym90aDp3aWR0aCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6Ym90aDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OndpZHRoIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgRU5EDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIGZ0X2Jpa2VfaW5mcmEgSVMgTk9UIE5VTEw7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICB0Zl9iaWtlX2luZnJhX3dpZHRoID0gQ0FTRQ0KDQogICAgICAgICAgICAtLSBmZWV0DQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdDp3aWR0aCIgTElLRSAnJSBmdCcNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6bGVmdDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVC8zLjI4MDg0DQogICAgICAgICAgICBXSEVOIG9uZV93YXlfY2FyID0gJ3RmJyBBTkQgb3NtLiJjeWNsZXdheTpyaWdodDp3aWR0aCIgTElLRSAnJSBmdCcNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6cmlnaHQ6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQvMy4yODA4NA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmJvdGg6d2lkdGgiIExJS0UgJyUgZnQnDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmJvdGg6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQvMy4yODA4NA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OndpZHRoIiBMSUtFICclIGZ0Jw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVC8zLjI4MDg0DQoNCiAgICAgICAgICAgIC0tIG1ldGVycw0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OmxlZnQ6d2lkdGgiIExJS0UgJyUgbScNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6bGVmdDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciA9ICd0ZicgQU5EIG9zbS4iY3ljbGV3YXk6cmlnaHQ6d2lkdGgiIExJS0UgJyUgbScNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6cmlnaHQ6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTpib3RoOndpZHRoIiBMSUtFICclIG0nDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OmJvdGg6d2lkdGgiIGZyb20gJ1xcZCtcXC4/XFxkP1xcZD8nKTo6RkxPQVQNCiAgICAgICAgICAgIFdIRU4gb3NtLiJjeWNsZXdheTp3aWR0aCIgTElLRSAnJSBtJw0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KDQogICAgICAgICAgICAtLSBubyB1bml0cyAoZGVmYXVsdD1tZXRlcnMpDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6bGVmdDp3aWR0aCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6bGVmdDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgV0hFTiBvbmVfd2F5X2NhciA9ICd0ZicgQU5EIG9zbS4iY3ljbGV3YXk6cmlnaHQ6d2lkdGgiIElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgVEhFTiBzdWJzdHJpbmcoImN5Y2xld2F5OnJpZ2h0OndpZHRoIiBmcm9tICdcXGQrXFwuP1xcZD9cXGQ/Jyk6OkZMT0FUDQogICAgICAgICAgICBXSEVOIG9zbS4iY3ljbGV3YXk6Ym90aDp3aWR0aCIgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICBUSEVOIHN1YnN0cmluZygiY3ljbGV3YXk6Ym90aDp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgV0hFTiBvc20uImN5Y2xld2F5OndpZHRoIiBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgIFRIRU4gc3Vic3RyaW5nKCJjeWNsZXdheTp3aWR0aCIgZnJvbSAnXFxkK1xcLj9cXGQ/XFxkPycpOjpGTE9BVA0KICAgICAgICAgICAgRU5EDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIHRmX2Jpa2VfaW5mcmEgSVMgTk9UIE5VTEw7DQoNCmBgYA0KDQojIyMjIyA+IGNsYXNzIGFkanVzdG1lbnRzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNClNFVCAgICAgZnVuY3Rpb25hbF9jbGFzcyA9ICd0ZXJ0aWFyeScNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyBJTiAoJ3Jlc2lkZW50aWFsJywndW5jbGFzc2lmaWVkJykNCkFORCAgICAgKA0KICAgICAgICAgICAgZnRfYmlrZV9pbmZyYSBJTiAoJ3RyYWNrJywnYnVmZmVyZWRfbGFuZScsJ2xhbmUnKQ0KICAgICAgICBPUiAgdGZfYmlrZV9pbmZyYSBJTiAoJ3RyYWNrJywnYnVmZmVyZWRfbGFuZScsJ2xhbmUnKQ0KICAgICAgICBPUiAgZnRfbGFuZXMgPiAxDQogICAgICAgIE9SICB0Zl9sYW5lcyA+IDENCiAgICAgICAgT1IgIHNwZWVkX2xpbWl0ID49IDUwDQogICAgICAgICk7DQoNCi0tIFRoaW5ncyBjaGFuZ2VkOiBzcGVlZCBsaW1pdCBmcm9tIDMwIG1waCB0byA1MCBrbWgNCmBgYA0KDQojIyMjIC0gUG9wdWxhdGUgaW50ZXJzZWN0aW9uIHRhYmxlDQoNCldoaWNoIGRvZXMgbW9kaWZpY2F0aW9ucyB0byB0aGUgZm9sbG93aW5nIGNvbHVtbnMgb24gdGhlIGludGVyc2VjdGlvbiB0YWJsZS4NCg0KIyMjIyMgPiBsZWdzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfaW50DQpTRVQgICAgIGxlZ3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKHJvYWRfaWQpDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMNCiAgICAgICAgICAgIFdIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQuaW50X2lkIElOIChpbnRlcnNlY3Rpb25fZnJvbSxpbnRlcnNlY3Rpb25fdG8pDQopOw0KDQpgYGANCg0KIyMjIyMgPiBzaWduYWxpemVkDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgU0VUIHNpZ25hbGl6ZWQgPSAnZic7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSB0cmFmZmljIHNpZ25hbHMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfaW50DQpTRVQgICAgIHNpZ25hbGl6ZWQgPSAndCcNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludCBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvc20uaGlnaHdheSA9ICd0cmFmZmljX3NpZ25hbHMnOw0KDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfaW50DQpTRVQgICAgIHNpZ25hbGl6ZWQgPSAndCcNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cywNCiAgICAgICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzLm9zbV9pZCA9IG9zbS5vc21faWQNCkFORCAgICAgaW50X2lkID0gcmVjZWl2ZWQuc2Ffd2F5cy5pbnRlcnNlY3Rpb25fdG8NCkFORCAgICAgb3NtLiJ0cmFmZmljX3NpZ25hbHM6ZGlyZWN0aW9uIiA9ICdmb3J3YXJkJzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX2ludA0KU0VUICAgICBzaWduYWxpemVkID0gJ3QnDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMsDQogICAgICAgIHJlY2VpdmVkLnNhX2Z1bGxfbGluZSBvc20NCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5cy5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIGludF9pZCA9IHJlY2VpdmVkLnNhX3dheXMuaW50ZXJzZWN0aW9uX2Zyb20NCkFORCAgICAgb3NtLiJ0cmFmZmljX3NpZ25hbHM6ZGlyZWN0aW9uIiA9ICdiYWNrd2FyZCc7DQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIEhBV0tzIGFuZCBvdGhlciB2YXJpYW50cw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQNClNFVCAgICAgc2lnbmFsaXplZCA9ICd0Jw0KV0hFUkUgICBsZWdzID4gMg0KQU5EICAgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQgb3NtDQogICAgICAgICAgICBXSEVSRSAgIG9zbS5oaWdod2F5ID0gJ2Nyb3NzaW5nJw0KICAgICAgICAgICAgQU5EICAgICBvc20uY3Jvc3NpbmcgSU4gKCd0cmFmZmljX3NpZ25hbHMnLCdwZWxpY2FuJywndG91Y2FuJykNCiAgICAgICAgICAgIEFORCAgICAgU1RfRFdpdGhpbihyZWNlaXZlZC5zYV93YXlzX2ludC5nZW9tLCBvc20ud2F5LCAyNSkNCiAgICAgICAgKTsNCg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gQ2FwdHVyZSBzaWduYWxzIGZyb20gb3RoZXIgcG9pbnRzDQotLSBvbiB0aGUgaW50ZXJzZWN0aW9uDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX2ludA0KU0VUICAgICBzaWduYWxpemVkID0gJ3QnDQpXSEVSRSAgIGxlZ3MgPiAyDQpBTkQgICAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaQ0KICAgICAgICAgICAgV0hFUkUgICBpLnNpZ25hbGl6ZWQNCiAgICAgICAgICAgIEFORCAgICAgU1RfRFdpdGhpbihyZWNlaXZlZC5zYV93YXlzX2ludC5nZW9tLCBpLmdlb20sIDI1KQ0KICAgICAgICApOw0KDQpgYGANCg0KIyMjIyMgPiBzdG9wcw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFIHJlY2VpdmVkLnNhX3dheXNfaW50IFNFVCBzdG9wcyA9ICdmJzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX2ludA0KU0VUICAgICBzdG9wcyA9ICd0Jw0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50IG9zbQ0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzX2ludC5vc21faWQgPSBvc20ub3NtX2lkDQpBTkQgICAgIG9zbS5oaWdod2F5ID0gJ3N0b3AnDQpBTkQgICAgIG9zbS5zdG9wID0gJ2FsbCc7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQNClNFVCAgICAgc3RvcHMgPSAndCcNCldIRVJFICAgbGVncyA+IDINCkFORCAgICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzX2ludCBpDQogICAgICAgICAgICBXSEVSRSAgIGkuc3RvcHMNCiAgICAgICAgICAgIEFORCAgICAgU1RfRFdpdGhpbihyZWNlaXZlZC5zYV93YXlzX2ludC5nZW9tLCBpLmdlb20sIDI1KQ0KICAgICAgICApOw0KDQpgYGANCg0KIyMjIyMgPiBycmZiDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgU0VUIHJyZmIgPSBGQUxTRTsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX2ludA0KU0VUICAgICBycmZiID0gVFJVRQ0KV0hFUkUgICBsZWdzID4gMg0KQU5EICAgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQgb3NtDQogICAgICAgICAgICBXSEVSRSAgIG9zbS5oaWdod2F5ID0gJ2Nyb3NzaW5nJw0KICAgICAgICAgICAgQU5EICAgICBvc20uZmxhc2hpbmdfbGlnaHRzID0gJ3llcycNCiAgICAgICAgICAgIEFORCAgICAgU1RfRFdpdGhpbihyZWNlaXZlZC5zYV93YXlzX2ludC5nZW9tLCBvc20ud2F5LCAyNSkNCiAgICAgICAgKTsNCmBgYA0KDQojIyMjIyA+IGlzbGFuZA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFIHJlY2VpdmVkLnNhX3dheXNfaW50IFNFVCBpc2xhbmQgPSBGQUxTRTsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX2ludA0KU0VUICAgICBpc2xhbmQgPSBUUlVFDQpXSEVSRSAgIGxlZ3MgPiAyDQpBTkQgICAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludCBvc20NCiAgICAgICAgICAgIFdIRVJFICAgb3NtLmhpZ2h3YXkgPSAnY3Jvc3NpbmcnDQogICAgICAgICAgICBBTkQgICAgIG9zbS5jcm9zc2luZyA9ICdpc2xhbmQnDQogICAgICAgICAgICBBTkQgICAgIFNUX0RXaXRoaW4ocmVjZWl2ZWQuc2Ffd2F5c19pbnQuZ2VvbSwgb3NtLndheSwgMjUpDQogICAgICAgICk7DQpgYGANCg0KQW4gZXhhbXBsZSBvZiBob3cgdGhlIHRhYmxlcyBsb29rIGxpa2UgYWZ0ZXIgdGhpcyBzdGVwOg0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgdGFiLmNhcCA9ICJXYXlzIHRhYmxlIn0NClNFTEVDVCAqIEZST00gcmVjZWl2ZWQuc2Ffd2F5cyBMSU1JVCAxMDsNCmBgYA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgdGFiLmNhcCA9ICJJbnRlcnNlY3Rpb24gdGFibGUgdGFibGUifQ0KU0VMRUNUICogRlJPTSByZWNlaXZlZC5zYV93YXlzX2ludCBMSU1JVCAxMDsNCmBgYA0KDQpUaGUgY29kZSBmb3IgdGhpcyBzdGVwIGlzIG5vdCBpbmNsdWRlZCBhcyBpdCBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgdGhlIFBmQiBjb2RlLCBhbmQgaXMgYWN0dWFsbHkgcXVpdGUgbG9uZy4gSG93ZXZlciwgaXQgY2FuIGJlIGV4YW1pbmVkIHRocm91Z2ggdGhlICpSbWQqIGZpbGUgZm9yIHRoaXMgUiBOb3RlYm9vay4NCg0KT25lIGFkZGl0aW9uYWwgdmFsdWUgdGhhdCBJIHdhcyBjb25zaWRlcmluZyBvbiBhZGRpbmcgaXMgc2xvcGUsIGhvd2V2ZXIgSSBoYXZlIG5vdCBnb25lIHRocm91Z2ggd2l0aCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZhcmlhYmxlIHlldC4gVGhpcyB3b3VsZCBhbHNvIGFmZmVjdCBzdGVwIDYuIA0KDQojIyMgNi4gQ2FsY3VsYXRlIHN0cmVzcw0KDQpUaGUgc2FtZSBhcyBzdGVwIDUsIHRoaXMgc3RlcCBjb25zaWRlcnMgbWFpbmx5IFNRTCBxdWVyaWVzIGFscmVhZHkgcGVyZm9ybWVkIGJ5IFBmQi4gSXQgd2lsbCBtYWlubHkgYWx0ZXIgdGhlIGNvbHVtbnMgbWVhbnQgdG8gaG9zdCB0aGUgc3RyZXNzIHJhbmsgZm9yIHNlZ21lbnRzIGFuZCBpbnRlcnNlY3Rpb25zLiBJdCBjb25zaWRlcnMgZGlmZmVyZW50IGNhc2VzIHRvIGRvIHRoZSBjbGFzc2lmaWNhdGlvbi4gVGhlIHNjcmlwdHMgdGhhdCBjYW4gYmUgZnVydGhlciBleGFtaW5lZCBvbiB0aGUgKlJtZCogZmlsZSBhcmU6DQoNCiMjIyMjID4gbW90b3J3YXkgdHJ1bmsNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfc2VnX3N0cmVzcyA9IE5VTEwsIHRmX3NlZ19zdHJlc3MgPSBOVUxMDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgSU4gKCdtb3RvcndheScsJ21vdG9yd2F5X2xpbmsnLCd0cnVuaycsJ3RydW5rX2xpbmsnKTsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9zZWdfc3RyZXNzID0gMywgdGZfc2VnX3N0cmVzcyA9IDMNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyBJTiAoJ21vdG9yd2F5JywnbW90b3J3YXlfbGluaycsJ3RydW5rJywndHJ1bmtfbGluaycpOw0KYGBgDQoNCiMjIyMjID4gaGlnaGVyIG9yZGVyDQoNCmBgYHtyIGhpZ2hlciBvcmRlciwgaW5jbHVkZSA9IEZBTFNFfQ0Kc3RyZXNzX2hpZ2hlcl9vcmRlcl93YXlzIDwtIGZ1bmN0aW9uKA0KICBjbGFzcywgDQogIGRlZmF1bHRfc3BlZWQsIA0KICBkZWZhdWx0X2xhbmVzLCANCiAgZGVmYXVsdF9wYXJraW5nLA0KICBkZWZhdWx0X3Bhcmtpbmdfd2lkdGgsDQogIGRlZmF1bHRfZmFjaWxpdHlfd2lkdGgNCiAgKQ0Kew0KICBzcWxkZigNCiAgICBwYXN0ZTAoDQogICAgICAiDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIGZ0X3NlZ19zdHJlc3MgPSBOVUxMLCB0Zl9zZWdfc3RyZXNzID0gTlVMTA0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzIElOICgnIiwgY2xhc3MsICInLCciLCBjbGFzcywgIid8fCdfbGluaycpOw0KDQotLSBmdCBkaXJlY3Rpb24NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9zZWdfc3RyZXNzID0NCiAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgIFdIRU4gZnRfYmlrZV9pbmZyYSA9ICd0cmFjaycgVEhFTiAxDQogICAgICAgICAgICBXSEVOIGZ0X2Jpa2VfaW5mcmEgPSAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPiA2MCBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDEgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9wYXJrLCIsIGRlZmF1bHRfcGFya2luZywgIikgPSAxIFRIRU4gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfcGFyaywiLCBkZWZhdWx0X3BhcmtpbmcsICIpID0gMSBUSEVOIDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA8IDUwIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgIFdIRU4gZnRfYmlrZV9pbmZyYSA9ICdsYW5lJyBBTkQgQ09BTEVTQ0UoZnRfcGFyaywiLCBkZWZhdWx0X3BhcmtpbmcsICIpID0gMCAgLS0gYmlrZSBsYW5lIHdpdGggbm8gcGFya2luZw0KICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA+IDUwIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGZ0X2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMSBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAxIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPD0gMzANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAyIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICBXSEVOIGZ0X2Jpa2VfaW5mcmEgPSAnbGFuZScgQU5EIENPQUxFU0NFKGZ0X3BhcmssIiwgZGVmYXVsdF9wYXJraW5nLCAiKSA9IDENCiAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfYmlrZV9pbmZyYV93aWR0aCwiLCBkZWZhdWx0X2ZhY2lsaXR5X3dpZHRoLCAiKSArICIsIGRlZmF1bHRfcGFya2luZ193aWR0aCwgIiA+PSA1ICAgLS0gdHJlYXQgYXMgYnVmZmVyZWQgbGFuZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA+IDYwIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDYwIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGZ0X2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMSBUSEVOIDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpIDwgNTAgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9iaWtlX2luZnJhX3dpZHRoLCIsIGRlZmF1bHRfZmFjaWxpdHlfd2lkdGgsICIpICsgIiwgZGVmYXVsdF9wYXJraW5nX3dpZHRoLCAiID49IDQgICAtLSB0cmVhdCBhcyBiaWtlIGxhbmUgd2l0aCBubyBwYXJraW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID4gNTAgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UoZnRfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAxIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA0MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDEgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA8PSAzMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDIgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIC0tIHNoYXJlZCBsYW5lDQogICAgICAgICAgICAgICAgICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpIDw9IDMwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGZ0X2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID0gMSBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDMNCiAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgRU5ELA0KICAgICAgICB0Zl9zZWdfc3RyZXNzID0NCiAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgIFdIRU4gdGZfYmlrZV9pbmZyYSA9ICd0cmFjaycgVEhFTiAxDQogICAgICAgICAgICBXSEVOIHRmX2Jpa2VfaW5mcmEgPSAnYnVmZmVyZWRfbGFuZScNCiAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPiA2MCBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDEgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9wYXJrLCIsIGRlZmF1bHRfcGFya2luZywgIikgPSAxIFRIRU4gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UodGZfcGFyaywiLCBkZWZhdWx0X3BhcmtpbmcsICIpID0gMSBUSEVOIDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA8IDUwIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgIFdIRU4gdGZfYmlrZV9pbmZyYSA9ICdsYW5lJyBBTkQgQ09BTEVTQ0UodGZfcGFyaywiLCBkZWZhdWx0X3BhcmtpbmcsICIpID0gMCAgLS0gYmlrZSBsYW5lIHdpdGggbm8gcGFya2luZw0KICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA+IDUwIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHRmX2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMSBUSEVOIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UodGZfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAxIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPD0gMzANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UodGZfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAyIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICBXSEVOIHRmX2Jpa2VfaW5mcmEgPSAnbGFuZScgQU5EIENPQUxFU0NFKHRmX3BhcmssIiwgZGVmYXVsdF9wYXJraW5nLCAiKSA9IDENCiAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UodGZfYmlrZV9pbmZyYV93aWR0aCwiLCBkZWZhdWx0X2ZhY2lsaXR5X3dpZHRoLCAiKSArICIsIGRlZmF1bHRfcGFya2luZ193aWR0aCwgIiA+PSA1ICAgLS0gdHJlYXQgYXMgYnVmZmVyZWQgbGFuZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA+IDYwIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDYwIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHRmX2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID4gMSBUSEVOIDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpIDwgNTAgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9iaWtlX2luZnJhX3dpZHRoLCIsIGRlZmF1bHRfZmFjaWxpdHlfd2lkdGgsICIpICsgIiwgZGVmYXVsdF9wYXJraW5nX3dpZHRoLCAiID49IDQgICAtLSB0cmVhdCBhcyBiaWtlIGxhbmUgd2l0aCBubyBwYXJraW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID4gNTAgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UodGZfbGFuZXMsIiwgZGVmYXVsdF9sYW5lcywgIikgPiAxIFRIRU4gMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPSA0MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDEgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA8PSAzMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh0Zl9sYW5lcywiLCBkZWZhdWx0X2xhbmVzLCAiKSA+IDIgVEhFTiAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIC0tIHNoYXJlZCBsYW5lDQogICAgICAgICAgICAgICAgICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpIDw9IDMwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHRmX2xhbmVzLCIsIGRlZmF1bHRfbGFuZXMsICIpID0gMSBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDMNCiAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgRU5EDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgSU4gKCciLCBjbGFzcywgIicsJyIsIGNsYXNzLCAiJ3x8J19saW5rJyk7DQogICAgICAiDQogICAgKSwNCiAgICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KICApDQp9DQoNCnN0cmVzc19oaWdoZXJfb3JkZXJfd2F5cygNCiAgY2xhc3MgPSAicHJpbWFyeSIsIA0KICBkZWZhdWx0X3NwZWVkID0gNzAsIA0KICBkZWZhdWx0X2xhbmVzID0gMiwgDQogIGRlZmF1bHRfcGFya2luZyA9IDEsDQogIGRlZmF1bHRfcGFya2luZ193aWR0aCA9IDIuNSwNCiAgZGVmYXVsdF9mYWNpbGl0eV93aWR0aCA9IDEuNQ0KKQ0KDQpzdHJlc3NfaGlnaGVyX29yZGVyX3dheXMoDQogIGNsYXNzID0gInNlY29uZGFyeSIsIA0KICBkZWZhdWx0X3NwZWVkID0gNzAsIA0KICBkZWZhdWx0X2xhbmVzID0gMiwgDQogIGRlZmF1bHRfcGFya2luZyA9IDEsDQogIGRlZmF1bHRfcGFya2luZ193aWR0aCA9IDIuNSwNCiAgZGVmYXVsdF9mYWNpbGl0eV93aWR0aCA9IDEuNQ0KKQ0KDQpzdHJlc3NfaGlnaGVyX29yZGVyX3dheXMoDQogIGNsYXNzID0gInRlcnRpYXJ5IiwgDQogIGRlZmF1bHRfc3BlZWQgPSA1MCwgDQogIGRlZmF1bHRfbGFuZXMgPSAxLCANCiAgZGVmYXVsdF9wYXJraW5nID0gMSwNCiAgZGVmYXVsdF9wYXJraW5nX3dpZHRoID0gMi41LA0KICBkZWZhdWx0X2ZhY2lsaXR5X3dpZHRoID0gMS41DQopDQoNCiMgVGhpbmdzIGNoYW5nZWQ6IHNwZWVkcyAtIDQwbXBoPTcwa21oIDM1bXBoPTYwa21oIDMwbXBoPTUwa21oIDI1bXBoPTQwa21oIDIwbXBoPTMwa21oLCB3aWR0aCAtIDE1ZnQ9NW0gMTNmdD00bSA4ZnQ9Mi41bSA1ZnQ9MS41bSAyN2Z0PThtIDE5ZnQ9Nm0NCmBgYA0KDQojIyMjIyA+IGxvd2VyIG9yZGVyDQoNCmBgYHtyIGxvd2VyIG9yZGVyLCBpbmNsdWRlID0gRkFMU0V9DQoNCnN0cmVzc19sb3dlcl9vcmRlcl93YXlzIDwtIGZ1bmN0aW9uKA0KICBjbGFzcywgDQogIGRlZmF1bHRfc3BlZWQsIA0KICBkZWZhdWx0X2xhbmVzLCANCiAgZGVmYXVsdF9wYXJraW5nLA0KICBkZWZhdWx0X3JvYWR3YXlfd2lkdGgNCiAgKQ0Kew0KICBzcWxkZigNCiAgICBwYXN0ZTAoDQogICAgICAiDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIGZ0X3NlZ19zdHJlc3M9TlVMTCwgdGZfc2VnX3N0cmVzcz1OVUxMDQogIFdIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICciLCBjbGFzcywgIic7DQogIA0KICBVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMNCiAgU0VUICAgICBmdF9zZWdfc3RyZXNzID0NCiAgICAgICAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpID0gNDANCiAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKGZ0X3BhcmssIiwgZGVmYXVsdF9wYXJraW5nLCAiKSArIENPQUxFU0NFKHRmX3BhcmssIiwgZGVmYXVsdF9wYXJraW5nLCAiKSA9IDIgICAgLS0gcGFya2luZyBvbiBib3RoIHNpZGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3aWR0aCwiLCBkZWZhdWx0X3JvYWR3YXlfd2lkdGgsICIpID49IDgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgQ0FTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHBhcmtpbmcgb24gb25lIHNpZGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHdpZHRoLCIsIGRlZmF1bHRfcm9hZHdheV93aWR0aCwgIikgPj0gNg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc3BlZWRfbGltaXQsIiwgZGVmYXVsdF9zcGVlZCwgIikgPD0gMzAgVEhFTiAxDQogICAgICAgICAgICAgIEVMU0UgMw0KICAgICAgICAgICAgICBFTkQsDQogICAgICAgICAgdGZfc2VnX3N0cmVzcyA9DQogICAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShzcGVlZF9saW1pdCwiLCBkZWZhdWx0X3NwZWVkLCAiKSA9IDQwDQogICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShmdF9wYXJrLCIsIGRlZmF1bHRfcGFya2luZywgIikgKyBDT0FMRVNDRSh0Zl9wYXJrLCIsIGRlZmF1bHRfcGFya2luZywgIikgPSAyICAgIC0tIHBhcmtpbmcgb24gYm90aCBzaWRlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uod2lkdGgsIiwgZGVmYXVsdF9yb2Fkd2F5X3dpZHRoLCAiKSA+PSA4DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgIENBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBwYXJraW5nIG9uIG9uZSBzaWRlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3aWR0aCwiLCBkZWZhdWx0X3JvYWR3YXlfd2lkdGgsICIpID49IDYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHNwZWVkX2xpbWl0LCIsIGRlZmF1bHRfc3BlZWQsICIpIDw9IDMwIFRIRU4gMQ0KICAgICAgICAgICAgICBFTFNFIDMNCiAgICAgICAgICAgICAgRU5EDQogIFdIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICciLCBjbGFzcywgIic7DQogIA0KICAgICAgIg0KICAgICksDQogICAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24NCiAgKQ0KfQ0KDQoNCg0Kc3RyZXNzX2xvd2VyX29yZGVyX3dheXMoDQogIGNsYXNzID0gInJlc2lkZW50aWFsIiwgDQogIGRlZmF1bHRfc3BlZWQgPSA0MCwgDQogIGRlZmF1bHRfbGFuZXMgPSAxLCANCiAgZGVmYXVsdF9wYXJraW5nID0gMSwNCiAgZGVmYXVsdF9yb2Fkd2F5X3dpZHRoID0gOA0KKQ0KDQpzdHJlc3NfbG93ZXJfb3JkZXJfd2F5cygNCiAgY2xhc3MgPSAidW5jbGFzc2lmaWVkIiwgDQogIGRlZmF1bHRfc3BlZWQgPSA0MCwgDQogIGRlZmF1bHRfbGFuZXMgPSAxLCANCiAgZGVmYXVsdF9wYXJraW5nID0gMSwNCiAgZGVmYXVsdF9yb2Fkd2F5X3dpZHRoID0gOA0KKQ0KDQojIFJlbWFyazogd2h5IGRvIHRoZXkgdXNlIGRlZmF1bHRfbGFuZXMgaWYgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IHVzZSBpdD8NCmBgYA0KDQojIyMjIyA+IGxpdmluZyBzdHJlZXQNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfc2VnX3N0cmVzcyA9IE5VTEwsIHRmX3NlZ19zdHJlc3MgPSBOVUxMDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAnbGl2aW5nX3N0cmVldCc7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9zZWdfc3RyZXNzID0gMywNCiAgICAgICAgdGZfc2VnX3N0cmVzcyA9IDMNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9saW5lIG9zbQ0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzID0gJ2xpdmluZ19zdHJlZXQnDQpBTkQgICAgIHJlY2VpdmVkLnNhX3dheXMub3NtX2lkID0gb3NtLm9zbV9pZA0KQU5EICAgICBvc20uYmljeWNsZSA9ICdubyc7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9zZWdfc3RyZXNzID0gQ09BTEVTQ0UoZnRfc2VnX3N0cmVzcywxKSwNCiAgICAgICAgdGZfc2VnX3N0cmVzcyA9IENPQUxFU0NFKHRmX3NlZ19zdHJlc3MsMSkNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdsaXZpbmdfc3RyZWV0JzsNCmBgYA0KDQojIyMjIyA+IHRyYWNrDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIGZ0X3NlZ19zdHJlc3MgPSBOVUxMLCB0Zl9zZWdfc3RyZXNzID0gTlVMTA0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzID0gJ3RyYWNrJzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ0X3NlZ19zdHJlc3MgPSAxLA0KICAgICAgICB0Zl9zZWdfc3RyZXNzID0gMQ0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzID0gJ3RyYWNrJzsNCmBgYA0KDQojIyMjIyA+IHBhdGgNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfc2VnX3N0cmVzcyA9IE5VTEwsIHRmX3NlZ19zdHJlc3MgPSBOVUxMDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAncGF0aCc7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9zZWdfc3RyZXNzID0gMSwNCiAgICAgICAgdGZfc2VnX3N0cmVzcyA9IDENCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICdwYXRoJzsNCmBgYA0KDQojIyMjIyA+IG9uZSB3YXkgcmVzZXQNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cw0KU0VUICAgICBmdF9zZWdfc3RyZXNzID0gTlVMTA0KV0hFUkUgICBvbmVfd2F5ID0gJ3RmJzsNCg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIHRmX3NlZ19zdHJlc3MgPSBOVUxMDQpXSEVSRSAgIG9uZV93YXkgPSAnZnQnOw0KDQotLSByZXNldCBvcHBvc2l0ZSBzdHJlc3MgZm9yIG9uZS13YXkNCmBgYA0KDQojIyMjIyA+IG1vdG9yd2F5IHRydW5rIGludGVyc2VjdGlvbg0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9pbnRfc3RyZXNzID0gMSwgdGZfaW50X3N0cmVzcyA9IDENCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyBJTiAoJ21vdG9yd2F5JywndHJ1bmsnKTsNCg0KLS0gYXNzdW1lIGxvdyBzdHJlc3MsIHNpbmNlIHRoZXNlIGp1bmNpb25zIHdvdWxkIGFsd2F5cyBiZSBjb250cm9sbGVkIG9yIGZyZWUgZmxvd2luZw0KYGBgDQoNCiMjIyMjID4gcHJpbWFyeSBpbnRlcnNlY3Rpb24NCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfaW50X3N0cmVzcyA9IDEsIHRmX2ludF9zdHJlc3MgPSAxDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAncHJpbWFyeSc7DQoNCi0tIGFzc3VtZSBsb3cgc3RyZXNzLCBzaW5jZSB0aGVzZSBqdW5jaW9ucyB3b3VsZCBhbHdheXMgYmUgY29udHJvbGxlZCBvciBmcmVlIGZsb3dpbmcNCmBgYA0KDQojIyMjIyA+IHNlY29uZGFyeSBpbnRlcnNlY3Rpb24gDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXMgU0VUIGZ0X2ludF9zdHJlc3MgPSAxLCB0Zl9pbnRfc3RyZXNzID0gMQ0KV0hFUkUgICBmdW5jdGlvbmFsX2NsYXNzID0gJ3NlY29uZGFyeSc7DQoNCi0tIGFzc3VtZSBsb3cgc3RyZXNzLCBzaW5jZSB0aGVzZSBqdW5jaW9ucyB3b3VsZCBhbHdheXMgYmUgY29udHJvbGxlZCBvciBmcmVlIGZsb3dpbmcNCmBgYA0KDQojIyMjIyA+IHRlcnRpYXJ5IGludGVyc2VjdGlvbiANCg0KYGBge3IgdGVydGlhcnkgaW50ZXJzZWN0aW9uLCBpbmNsdWRlID0gRkFMU0V9DQpzdHJlc3NfdGVydGlhcnlfaW50IDwtIGZ1bmN0aW9uKA0KICBwcmltYXJ5X3NwZWVkLCANCiAgc2Vjb25kYXJ5X3NwZWVkLCANCiAgcHJpbWFyeV9sYW5lcywgDQogIHNlY29uZGFyeV9sYW5lcw0KICApDQp7DQogIHNxbGRmKA0KICAgIHBhc3RlMCgNCiAgICAgICINClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfaW50X3N0cmVzcyA9IDEsIHRmX2ludF9zdHJlc3MgPSAxDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgPSAndGVydGlhcnknOw0KDQotLSBmdA0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ0X2ludF9zdHJlc3MgPSAzDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGkNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICd0ZXJ0aWFyeScNCkFORCAgICAgcmVjZWl2ZWQuc2Ffd2F5cy5pbnRlcnNlY3Rpb25fdG8gPSBpLmludF9pZA0KQU5EICAgICBOT1QgaS5zaWduYWxpemVkDQpBTkQgICAgIE5PVCBpLnN0b3BzDQpBTkQgICAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyB3DQogICAgICAgICAgICBXSEVSRSAgIGkuaW50X2lkIElOICh3LmludGVyc2VjdGlvbl90byx3LmludGVyc2VjdGlvbl9mcm9tKQ0KICAgICAgICAgICAgQU5EICAgICBDT0FMRVNDRShyZWNlaXZlZC5zYV93YXlzLm5hbWUsJ2EnKSAhPSBDT0FMRVNDRSh3Lm5hbWUsJ2InKQ0KICAgICAgICAgICAgQU5EICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzIElOICgnbW90b3J3YXknLCd0cnVuaycpIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgIC0tIHR3byB3YXkgcHJpbWFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdwcmltYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gb25lIHdheSBwcmltYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3ByaW1hcnknIEFORCB3Lm9uZV93YXkgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA+IDIgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDYwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSB0d28gd2F5IHNlY29uZGFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdzZWNvbmRhcnknIEFORCB3Lm9uZV93YXkgSVMgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIG9uZSB3YXkgc2Vjb25kYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3NlY29uZGFyeScgQU5EIHcub25lX3dheSBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPiAyIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgIEVORA0KKTsNCg0KDQotLSB0Zg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIHRmX2ludF9zdHJlc3MgPSAzDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGkNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyA9ICd0ZXJ0aWFyeScNCkFORCAgICAgcmVjZWl2ZWQuc2Ffd2F5cy5pbnRlcnNlY3Rpb25fZnJvbSA9IGkuaW50X2lkDQpBTkQgICAgIE5PVCBpLnNpZ25hbGl6ZWQNCkFORCAgICAgTk9UIGkuc3RvcHMNCkFORCAgICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHcNCiAgICAgICAgICAgIFdIRVJFICAgaS5pbnRfaWQgSU4gKHcuaW50ZXJzZWN0aW9uX3RvLHcuaW50ZXJzZWN0aW9uX2Zyb20pDQogICAgICAgICAgICBBTkQgICAgIENPQUxFU0NFKHJlY2VpdmVkLnNhX3dheXMubmFtZSwnYScpICE9IENPQUxFU0NFKHcubmFtZSwnYicpDQogICAgICAgICAgICBBTkQgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgSU4gKCdtb3RvcndheScsJ3RydW5rJykgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gdHdvIHdheSBwcmltYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3ByaW1hcnknIEFORCB3Lm9uZV93YXkgSVMgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPiA0IFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSBvbmUgd2F5IHByaW1hcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAncHJpbWFyeScgQU5EIHcub25lX3dheSBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID4gMiBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNjAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIHR3byB3YXkgc2Vjb25kYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3NlY29uZGFyeScgQU5EIHcub25lX3dheSBJUyBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPiA0IFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gb25lIHdheSBzZWNvbmRhcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAnc2Vjb25kYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA+IDIgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgRU5EDQopOw0KDQogICAgICAiDQogICAgKSwNCiAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24NCikNCn0NCg0Kc3RyZXNzX3RlcnRpYXJ5X2ludCgNCiAgcHJpbWFyeV9zcGVlZCA9IDcwLA0KICBzZWNvbmRhcnlfc3BlZWQgPSA3MCwNCiAgcHJpbWFyeV9sYW5lcyA9IDIsDQogIHNlY29uZGFyeV9sYW5lcyA9IDINCikNCg0KYGBgDQoNCiMjIyMjID4gbG93ZXIgaW50ZXJzZWN0aW9uIA0KDQpgYGB7ciBsb3dlciBpbnRlcnNlY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NCnN0cmVzc19sb3dlcl9pbnQgPC0gZnVuY3Rpb24oDQogIHByaW1hcnlfc3BlZWQsDQogIHNlY29uZGFyeV9zcGVlZCwNCiAgdGVydGlhcnlfc3BlZWQsDQogIHByaW1hcnlfbGFuZXMsDQogIHNlY29uZGFyeV9sYW5lcywNCiAgdGVydGlhcnlfbGFuZXMNCikNCnsNCiAgc3FsZGYoDQogICAgcGFzdGUwKA0KICAgICAgIg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzIFNFVCBmdF9pbnRfc3RyZXNzID0gMSwgdGZfaW50X3N0cmVzcyA9IDENCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyBJTiAoJ3Jlc2lkZW50aWFsJywndW5jbGFzc2lmaWVkJywnbGl2aW5nX3N0cmVldCcsJ3RyYWNrJywncGF0aCcpOw0KDQotLSBmdA0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIGZ0X2ludF9zdHJlc3MgPSAzDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGkNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyBJTiAoJ3Jlc2lkZW50aWFsJywndW5jbGFzc2lmaWVkJywnbGl2aW5nX3N0cmVldCcsJ3RyYWNrJywncGF0aCcpDQpBTkQgICAgIHJlY2VpdmVkLnNhX3dheXMuaW50ZXJzZWN0aW9uX3RvID0gaS5pbnRfaWQNCkFORCAgICAgTk9UIGkuc2lnbmFsaXplZA0KQU5EICAgICBOT1QgaS5zdG9wcw0KQU5EICAgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgdw0KICAgICAgICAgICAgV0hFUkUgICBpLmludF9pZCBJTiAody5pbnRlcnNlY3Rpb25fdG8sdy5pbnRlcnNlY3Rpb25fZnJvbSkNCiAgICAgICAgICAgIEFORCAgICAgQ09BTEVTQ0UocmVjZWl2ZWQuc2Ffd2F5cy5uYW1lLCdhJykgIT0gQ09BTEVTQ0Uody5uYW1lLCdiJykNCiAgICAgICAgICAgIEFORCAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyBJTiAoJ21vdG9yd2F5JywndHJ1bmsnKSBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAtLSB0d28gd2F5IHByaW1hcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAncHJpbWFyeScgQU5EIHcub25lX3dheSBJUyBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA+IDQgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIG9uZSB3YXkgcHJpbWFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdwcmltYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPiAyIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA2MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gdHdvIHdheSBzZWNvbmRhcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAnc2Vjb25kYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA+IDQgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSBvbmUgd2F5IHNlY29uZGFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdzZWNvbmRhcnknIEFORCB3Lm9uZV93YXkgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID4gMiBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIHR3byB3YXkgdGVydGlhcnkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiB3LmZ1bmN0aW9uYWxfY2xhc3MgPSAndGVydGlhcnknIEFORCB3Lm9uZV93YXkgSVMgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA+IDQgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gb25lIHdheSB0ZXJ0aWFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICd0ZXJ0aWFyeScgQU5EIHcub25lX3dheSBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA+IDIgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgIEVORA0KKTsNCg0KDQotLSB0Zg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzDQpTRVQgICAgIHRmX2ludF9zdHJlc3MgPSAzDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGkNCldIRVJFICAgZnVuY3Rpb25hbF9jbGFzcyBJTiAoJ3Jlc2lkZW50aWFsJywndW5jbGFzc2lmaWVkJywnbGl2aW5nX3N0cmVldCcsJ3RyYWNrJywncGF0aCcpDQpBTkQgICAgIHJlY2VpdmVkLnNhX3dheXMuaW50ZXJzZWN0aW9uX2Zyb20gPSBpLmludF9pZA0KQU5EICAgICBOT1QgaS5zaWduYWxpemVkDQpBTkQgICAgIE5PVCBpLnN0b3BzDQpBTkQgICAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyB3DQogICAgICAgICAgICBXSEVSRSAgIGkuaW50X2lkIElOICh3LmludGVyc2VjdGlvbl90byx3LmludGVyc2VjdGlvbl9mcm9tKQ0KICAgICAgICAgICAgQU5EICAgICBDT0FMRVNDRShyZWNlaXZlZC5zYV93YXlzLm5hbWUsJ2EnKSAhPSBDT0FMRVNDRSh3Lm5hbWUsJ2InKQ0KICAgICAgICAgICAgQU5EICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzIElOICgnbW90b3J3YXknLCd0cnVuaycpIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgIC0tIHR3byB3YXkgcHJpbWFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdwcmltYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPSA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gb25lIHdheSBwcmltYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3ByaW1hcnknIEFORCB3Lm9uZV93YXkgSVMgTk9UIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA+IDIgVEhFTiBUUlVFDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5ycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNzAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHByaW1hcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBwcmltYXJ5X3NwZWVkLCAiKSA+IDYwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRob3V0IHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBwcmltYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgcHJpbWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgcHJpbWFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHByaW1hcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSB0d28gd2F5IHNlY29uZGFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICdzZWNvbmRhcnknIEFORCB3Lm9uZV93YXkgSVMgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgKyBDT0FMRVNDRSh3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA2MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGhvdXQgcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID0gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KDQogICAgICAgICAgICAgICAgICAgIC0tIG9uZSB3YXkgc2Vjb25kYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3NlY29uZGFyeScgQU5EIHcub25lX3dheSBJUyBOT1QgTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPiAyIFRIRU4gVFJVRQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdpdGggcnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkucnJmYg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5mdF9sYW5lcyx3LnRmX2xhbmVzLCIsIHNlY29uZGFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHNlY29uZGFyeV9zcGVlZCwgIikgPiA3MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA8IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgc2Vjb25kYXJ5X2xhbmVzLCAiKSA9IDINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgc2Vjb25kYXJ5X3NwZWVkLCAiKSA+IDUwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCBzZWNvbmRhcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCBzZWNvbmRhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgLS0gdHdvIHdheSB0ZXJ0aWFyeQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHcuZnVuY3Rpb25hbF9jbGFzcyA9ICd0ZXJ0aWFyeScgQU5EIHcub25lX3dheSBJUyBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID4gNCBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPSA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuc3BlZWRfbGltaXQsIiwgdGVydGlhcnlfc3BlZWQsICIpID4gNTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGkuaXNsYW5kIFRIRU4gRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpICsgQ09BTEVTQ0Uody50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPCA0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID0gNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA9IDUwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLmlzbGFuZCBUSEVOIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLCIsIHRlcnRpYXJ5X2xhbmVzLCAiKSArIENPQUxFU0NFKHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpIDwgNA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaS5pc2xhbmQgVEhFTiBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCg0KICAgICAgICAgICAgICAgICAgICAtLSBvbmUgd2F5IHRlcnRpYXJ5DQogICAgICAgICAgICAgICAgICAgIFdIRU4gdy5mdW5jdGlvbmFsX2NsYXNzID0gJ3RlcnRpYXJ5JyBBTkQgdy5vbmVfd2F5IElTIE5PVCBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID4gMiBUSEVOIFRSVUUNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB3aXRoIHJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBpLnJyZmINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPSAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDcwIFRIRU4gVFJVRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIEZBTFNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHcuZnRfbGFuZXMsdy50Zl9sYW5lcywiLCB0ZXJ0aWFyeV9sYW5lcywgIikgPCAyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LnNwZWVkX2xpbWl0LCIsIHRlcnRpYXJ5X3NwZWVkLCAiKSA+IDYwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gd2l0aG91dCBycmZiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpID0gMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA1MCBUSEVOIFRSVUUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBGQUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRSh3LmZ0X2xhbmVzLHcudGZfbGFuZXMsIiwgdGVydGlhcnlfbGFuZXMsICIpIDwgMg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uody5zcGVlZF9saW1pdCwiLCB0ZXJ0aWFyeV9zcGVlZCwgIikgPiA1MA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgRkFMU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgRU5EDQopOw0KDQogICAgICAiDQogICAgKSwNCiAgICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KICApDQp9DQoNCnN0cmVzc19sb3dlcl9pbnQoDQogIHByaW1hcnlfc3BlZWQgPSA3MCwNCiAgc2Vjb25kYXJ5X3NwZWVkID0gNzAsDQogIHRlcnRpYXJ5X3NwZWVkID0gNTAsDQogIHByaW1hcnlfbGFuZXMgPSAyLA0KICBzZWNvbmRhcnlfbGFuZXMgPSAyLA0KICB0ZXJ0aWFyeV9sYW5lcyA9IDENCikNCg0KYGBgDQoNCiMjIyMjID4gbGluayBpbnRlcnNlY3Rpb24NCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5cyBTRVQgZnRfaW50X3N0cmVzcyA9IDEsIHRmX2ludF9zdHJlc3MgPSAxDQpXSEVSRSAgIGZ1bmN0aW9uYWxfY2xhc3MgTElLRSAnJV9saW5rJzsNCmBgYA0KDQpBbiBleGFtcGxlIG9mIGhvdyB0aGUgdGFibGVzIGxvb2sgbGlrZSBhZnRlciB0aGlzIHN0ZXA6DQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCB0YWIuY2FwID0gIldheXMgdGFibGUifQ0KU0VMRUNUIG9zbV9pZCwgbmFtZSwgZnRfc2VnX3N0cmVzcywgdGZfc2VnX3N0cmVzcywgZnRfaW50X3N0cmVzcywgdGZfaW50X3N0cmVzcyBGUk9NIHJlY2VpdmVkLnNhX3dheXMgTElNSVQgMTA7DQpgYGANCg0KIyMjIDcuIEJ1aWxkIG5ldHdvcmsNCg0KT24gdGhpcyBzdGVwIHRoZSBuZXR3b3JrIGlzIGJ1aWx0IGJ5IGNyZWF0aW5nIHR3byB0YWJsZXM6IHZlcnRpY2VzIGFuZCBsaW5rcy4gQXMgdGhlIGxhc3QgMiBzdGVwcywgdGhlIGNvZGUgd29uJ3QgYmUgaW5jbHVkZSBidXQgY2FuIGJlIGFuYWx5emVkIG9uIHRoZSAqUm1kKiBmaWxlLiANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQ7DQpEUk9QIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rOw0KDQotLSBjcmVhdGUgbmV3IHRhYmxlcw0KQ1JFQVRFIFRBQkxFIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgKA0KICAgIHZlcnRfaWQgU0VSSUFMIFBSSU1BUlkgS0VZLA0KICAgIHJvYWRfaWQgSU5URUdFUiwNCiAgICB2ZXJ0X2Nvc3QgSU5URUdFUiwNCiAgICBnZW9tIGdlb21ldHJ5KHBvaW50LD9zYV9jcnMpDQopOw0KDQpDUkVBVEUgVEFCTEUgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAoDQogICAgbGlua19pZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgaW50X2lkIElOVEVHRVIsDQogICAgdHVybl9hbmdsZSBJTlRFR0VSLA0KICAgIGludF9jcm9zc2luZyBCT09MRUFOLA0KICAgIGludF9zdHJlc3MgSU5URUdFUiwNCiAgICBzb3VyY2VfdmVydCBJTlRFR0VSLA0KICAgIHNvdXJjZV9yb2FkX2lkIElOVEVHRVIsDQogICAgc291cmNlX3JvYWRfZGlyIFZBUkNIQVIoMiksDQogICAgc291cmNlX3JvYWRfYXppIElOVEVHRVIsDQogICAgc291cmNlX3JvYWRfbGVuZ3RoIElOVEVHRVIsDQogICAgc291cmNlX3N0cmVzcyBJTlRFR0VSLA0KICAgIHRhcmdldF92ZXJ0IElOVEVHRVIsDQogICAgdGFyZ2V0X3JvYWRfaWQgSU5URUdFUiwNCiAgICB0YXJnZXRfcm9hZF9kaXIgVkFSQ0hBUigyKSwNCiAgICB0YXJnZXRfcm9hZF9hemkgSU5URUdFUiwNCiAgICB0YXJnZXRfcm9hZF9sZW5ndGggSU5URUdFUiwNCiAgICB0YXJnZXRfc3RyZXNzIElOVEVHRVIsDQogICAgbGlua19jb3N0IElOVEVHRVIsDQogICAgbGlua19zdHJlc3MgSU5URUdFUiwNCiAgICBnZW9tIGdlb21ldHJ5KGxpbmVzdHJpbmcsP3NhX2NycykNCik7DQoNCi0tIGNyZWF0ZSB2ZXJ0aWNlcw0KSU5TRVJUIElOVE8gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCAocm9hZF9pZCwgZ2VvbSkNClNFTEVDVCAgd2F5cy5yb2FkX2lkLA0KICAgICAgICBTVF9MaW5lSW50ZXJwb2xhdGVQb2ludCh3YXlzLmdlb20sMC41KQ0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHdheXM7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV93YXlzX25ldF92ZXJ0X2dlb20gT04gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCBVU0lORyBnaXN0IChnZW9tKTsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19uZXRfdmVydF9yb2FkaWQgT04gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCAocm9hZF9pZCk7DQpBTkFMWVpFIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQ7DQoNCi0tLS0tLS0tLS0tLS0tLQ0KLS0gYWRkIGxpbmtzIC0tDQotLS0tLS0tLS0tLS0tLS0NCi0tIHR3by13YXkgdG8gdHdvLXdheQ0KSU5TRVJUIElOVE8gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAoaW50X2lkLCBzb3VyY2VfdmVydCwgdGFyZ2V0X3ZlcnQsIGdlb20pDQpTRUxFQ1QgIGludHMuaW50X2lkLA0KICAgICAgICB2ZXJ0MS52ZXJ0X2lkLA0KICAgICAgICB2ZXJ0Mi52ZXJ0X2lkLA0KICAgICAgICBTVF9NYWtlbGluZSh2ZXJ0MS5nZW9tLHZlcnQyLmdlb20pDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGludHMsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQyLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMg0KV0hFUkUgICB2ZXJ0MS5yb2FkX2lkID0gcm9hZHMxLnJvYWRfaWQNCkFORCAgICAgdmVydDIucm9hZF9pZCA9IHJvYWRzMi5yb2FkX2lkDQpBTkQgICAgIGludHMuaW50X2lkIElOIChyb2FkczEuaW50ZXJzZWN0aW9uX2Zyb20sIHJvYWRzMS5pbnRlcnNlY3Rpb25fdG8pDQpBTkQgICAgIGludHMuaW50X2lkIElOIChyb2FkczIuaW50ZXJzZWN0aW9uX2Zyb20sIHJvYWRzMi5pbnRlcnNlY3Rpb25fdG8pDQpBTkQgICAgIHJvYWRzMS5vbmVfd2F5IElTIE5VTEwNCkFORCAgICAgcm9hZHMyLm9uZV93YXkgSVMgTlVMTA0KQU5EICAgICByb2FkczEucm9hZF9pZCAhPSByb2FkczIucm9hZF9pZDsNCg0KLS0gdHdvLXdheSB0byBmcm9tLXRvDQpJTlNFUlQgSU5UTyByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChpbnRfaWQsIHNvdXJjZV92ZXJ0LCB0YXJnZXRfdmVydCwgZ2VvbSkNClNFTEVDVCAgaW50cy5pbnRfaWQsDQogICAgICAgIHZlcnQxLnZlcnRfaWQsDQogICAgICAgIHZlcnQyLnZlcnRfaWQsDQogICAgICAgIFNUX01ha2VsaW5lKHZlcnQxLmdlb20sdmVydDIuZ2VvbSkNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaW50cywNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDIsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMyDQpXSEVSRSAgIHZlcnQxLnJvYWRfaWQgPSByb2FkczEucm9hZF9pZA0KQU5EICAgICB2ZXJ0Mi5yb2FkX2lkID0gcm9hZHMyLnJvYWRfaWQNCkFORCAgICAgaW50cy5pbnRfaWQgSU4gKHJvYWRzMS5pbnRlcnNlY3Rpb25fZnJvbSwgcm9hZHMxLmludGVyc2VjdGlvbl90bykNCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczIuaW50ZXJzZWN0aW9uX2Zyb20NCkFORCAgICAgcm9hZHMxLm9uZV93YXkgSVMgTlVMTA0KQU5EICAgICByb2FkczIub25lX3dheSA9ICdmdCcNCkFORCAgICAgcm9hZHMxLnJvYWRfaWQgIT0gcm9hZHMyLnJvYWRfaWQ7DQoNCi0tIHR3by13YXkgdG8gdG8tZnJvbQ0KSU5TRVJUIElOVE8gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAoaW50X2lkLCBzb3VyY2VfdmVydCwgdGFyZ2V0X3ZlcnQsIGdlb20pDQpTRUxFQ1QgIGludHMuaW50X2lkLA0KICAgICAgICB2ZXJ0MS52ZXJ0X2lkLA0KICAgICAgICB2ZXJ0Mi52ZXJ0X2lkLA0KICAgICAgICBTVF9NYWtlbGluZSh2ZXJ0MS5nZW9tLHZlcnQyLmdlb20pDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGludHMsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQyLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMg0KV0hFUkUgICB2ZXJ0MS5yb2FkX2lkID0gcm9hZHMxLnJvYWRfaWQNCkFORCAgICAgdmVydDIucm9hZF9pZCA9IHJvYWRzMi5yb2FkX2lkDQpBTkQgICAgIGludHMuaW50X2lkIElOIChyb2FkczEuaW50ZXJzZWN0aW9uX2Zyb20sIHJvYWRzMS5pbnRlcnNlY3Rpb25fdG8pDQpBTkQgICAgIGludHMuaW50X2lkID0gcm9hZHMyLmludGVyc2VjdGlvbl90bw0KQU5EICAgICByb2FkczEub25lX3dheSBJUyBOVUxMDQpBTkQgICAgIHJvYWRzMi5vbmVfd2F5ID0gJ3RmJw0KQU5EICAgICByb2FkczEucm9hZF9pZCAhPSByb2FkczIucm9hZF9pZDsNCg0KLS0gZnJvbS10byB0byB0d28td2F5DQpJTlNFUlQgSU5UTyByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChpbnRfaWQsIHNvdXJjZV92ZXJ0LCB0YXJnZXRfdmVydCwgZ2VvbSkNClNFTEVDVCAgaW50cy5pbnRfaWQsDQogICAgICAgIHZlcnQxLnZlcnRfaWQsDQogICAgICAgIHZlcnQyLnZlcnRfaWQsDQogICAgICAgIFNUX01ha2VsaW5lKHZlcnQxLmdlb20sdmVydDIuZ2VvbSkNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaW50cywNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDIsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMyDQpXSEVSRSAgIHZlcnQxLnJvYWRfaWQgPSByb2FkczEucm9hZF9pZA0KQU5EICAgICB2ZXJ0Mi5yb2FkX2lkID0gcm9hZHMyLnJvYWRfaWQNCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczEuaW50ZXJzZWN0aW9uX3RvDQpBTkQgICAgIGludHMuaW50X2lkIElOIChyb2FkczIuaW50ZXJzZWN0aW9uX2Zyb20sIHJvYWRzMi5pbnRlcnNlY3Rpb25fdG8pDQpBTkQgICAgIHJvYWRzMS5vbmVfd2F5ID0gJ2Z0Jw0KQU5EICAgICByb2FkczIub25lX3dheSBJUyBOVUxMDQpBTkQgICAgIHJvYWRzMS5yb2FkX2lkICE9IHJvYWRzMi5yb2FkX2lkOw0KDQotLSBmcm9tLXRvIHRvIGZyb20tdG8NCklOU0VSVCBJTlRPIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsgKGludF9pZCwgc291cmNlX3ZlcnQsIHRhcmdldF92ZXJ0LCBnZW9tKQ0KU0VMRUNUICBpbnRzLmludF9pZCwNCiAgICAgICAgdmVydDEudmVydF9pZCwNCiAgICAgICAgdmVydDIudmVydF9pZCwNCiAgICAgICAgU1RfTWFrZWxpbmUodmVydDEuZ2VvbSx2ZXJ0Mi5nZW9tKQ0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzX2ludCBpbnRzLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MiwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczINCldIRVJFICAgdmVydDEucm9hZF9pZCA9IHJvYWRzMS5yb2FkX2lkDQpBTkQgICAgIHZlcnQyLnJvYWRfaWQgPSByb2FkczIucm9hZF9pZA0KQU5EICAgICBpbnRzLmludF9pZCA9IHJvYWRzMS5pbnRlcnNlY3Rpb25fdG8NCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczIuaW50ZXJzZWN0aW9uX2Zyb20NCkFORCAgICAgcm9hZHMxLm9uZV93YXkgPSAnZnQnDQpBTkQgICAgIHJvYWRzMi5vbmVfd2F5ID0gJ2Z0Jw0KQU5EICAgICByb2FkczEucm9hZF9pZCAhPSByb2FkczIucm9hZF9pZDsNCg0KLS0gZnJvbS10byB0byB0by1mcm9tDQpJTlNFUlQgSU5UTyByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChpbnRfaWQsIHNvdXJjZV92ZXJ0LCB0YXJnZXRfdmVydCwgZ2VvbSkNClNFTEVDVCAgaW50cy5pbnRfaWQsDQogICAgICAgIHZlcnQxLnZlcnRfaWQsDQogICAgICAgIHZlcnQyLnZlcnRfaWQsDQogICAgICAgIFNUX01ha2VsaW5lKHZlcnQxLmdlb20sdmVydDIuZ2VvbSkNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaW50cywNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDIsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMyDQpXSEVSRSAgIHZlcnQxLnJvYWRfaWQgPSByb2FkczEucm9hZF9pZA0KQU5EICAgICB2ZXJ0Mi5yb2FkX2lkID0gcm9hZHMyLnJvYWRfaWQNCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczEuaW50ZXJzZWN0aW9uX3RvDQpBTkQgICAgIGludHMuaW50X2lkID0gcm9hZHMyLmludGVyc2VjdGlvbl90bw0KQU5EICAgICByb2FkczEub25lX3dheSA9ICdmdCcNCkFORCAgICAgcm9hZHMyLm9uZV93YXkgPSAndGYnDQpBTkQgICAgIHJvYWRzMS5yb2FkX2lkICE9IHJvYWRzMi5yb2FkX2lkOw0KDQotLSB0by1mcm9tIHRvIHR3by13YXkNCklOU0VSVCBJTlRPIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsgKGludF9pZCwgc291cmNlX3ZlcnQsIHRhcmdldF92ZXJ0LCBnZW9tKQ0KU0VMRUNUICBpbnRzLmludF9pZCwNCiAgICAgICAgdmVydDEudmVydF9pZCwNCiAgICAgICAgdmVydDIudmVydF9pZCwNCiAgICAgICAgU1RfTWFrZWxpbmUodmVydDEuZ2VvbSx2ZXJ0Mi5nZW9tKQ0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzX2ludCBpbnRzLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MiwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczINCldIRVJFICAgdmVydDEucm9hZF9pZCA9IHJvYWRzMS5yb2FkX2lkDQpBTkQgICAgIHZlcnQyLnJvYWRfaWQgPSByb2FkczIucm9hZF9pZA0KQU5EICAgICBpbnRzLmludF9pZCA9IHJvYWRzMS5pbnRlcnNlY3Rpb25fZnJvbQ0KQU5EICAgICBpbnRzLmludF9pZCBJTiAocm9hZHMyLmludGVyc2VjdGlvbl9mcm9tLCByb2FkczIuaW50ZXJzZWN0aW9uX3RvKQ0KQU5EICAgICByb2FkczEub25lX3dheSA9ICd0ZicNCkFORCAgICAgcm9hZHMyLm9uZV93YXkgSVMgTlVMTA0KQU5EICAgICByb2FkczEucm9hZF9pZCAhPSByb2FkczIucm9hZF9pZDsNCg0KLS0gdG8tZnJvbSB0byB0by1mcm9tDQpJTlNFUlQgSU5UTyByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChpbnRfaWQsIHNvdXJjZV92ZXJ0LCB0YXJnZXRfdmVydCwgZ2VvbSkNClNFTEVDVCAgaW50cy5pbnRfaWQsDQogICAgICAgIHZlcnQxLnZlcnRfaWQsDQogICAgICAgIHZlcnQyLnZlcnRfaWQsDQogICAgICAgIFNUX01ha2VsaW5lKHZlcnQxLmdlb20sdmVydDIuZ2VvbSkNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19pbnQgaW50cywNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfdmVydCB2ZXJ0MSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDIsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMyDQpXSEVSRSAgIHZlcnQxLnJvYWRfaWQgPSByb2FkczEucm9hZF9pZA0KQU5EICAgICB2ZXJ0Mi5yb2FkX2lkID0gcm9hZHMyLnJvYWRfaWQNCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczEuaW50ZXJzZWN0aW9uX2Zyb20NCkFORCAgICAgaW50cy5pbnRfaWQgPSByb2FkczIuaW50ZXJzZWN0aW9uX3RvDQpBTkQgICAgIHJvYWRzMS5vbmVfd2F5ID0gJ3RmJw0KQU5EICAgICByb2FkczIub25lX3dheSA9ICd0ZicNCkFORCAgICAgcm9hZHMxLnJvYWRfaWQgIT0gcm9hZHMyLnJvYWRfaWQ7DQoNCi0tIHRvLWZyb20gdG8gZnJvbS10bw0KSU5TRVJUIElOVE8gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAoaW50X2lkLCBzb3VyY2VfdmVydCwgdGFyZ2V0X3ZlcnQsIGdlb20pDQpTRUxFQ1QgIGludHMuaW50X2lkLA0KICAgICAgICB2ZXJ0MS52ZXJ0X2lkLA0KICAgICAgICB2ZXJ0Mi52ZXJ0X2lkLA0KICAgICAgICBTVF9NYWtlbGluZSh2ZXJ0MS5nZW9tLHZlcnQyLmdlb20pDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfaW50IGludHMsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdmVydDEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHZlcnQyLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMg0KV0hFUkUgICB2ZXJ0MS5yb2FkX2lkID0gcm9hZHMxLnJvYWRfaWQNCkFORCAgICAgdmVydDIucm9hZF9pZCA9IHJvYWRzMi5yb2FkX2lkDQpBTkQgICAgIGludHMuaW50X2lkID0gcm9hZHMxLmludGVyc2VjdGlvbl9mcm9tDQpBTkQgICAgIGludHMuaW50X2lkID0gcm9hZHMyLmludGVyc2VjdGlvbl9mcm9tDQpBTkQgICAgIHJvYWRzMS5vbmVfd2F5ID0gJ3RmJw0KQU5EICAgICByb2FkczIub25lX3dheSA9ICdmdCcNCkFORCAgICAgcm9hZHMxLnJvYWRfaWQgIT0gcm9hZHMyLnJvYWRfaWQ7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggaWR4X3NhX3dheXNfbmV0X3ZlcnRfcm9hZF9pZCBPTiByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IChyb2FkX2lkKTsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19uZXRfbGlua19pbnRfaWQgT04gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAoaW50X2lkKTsNCkNSRUFURSBJTkRFWCBpZHhfc2Ffd2F5c19uZXRfbGlua19zcmNfdHJndCBPTiByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rIChzb3VyY2VfdmVydCx0YXJnZXRfdmVydCk7DQpDUkVBVEUgSU5ERVggaWR4X3NhX3dheXNfbmV0X2xpbmtfc3JjX3JkaWQgT04gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayAoc291cmNlX3JvYWRfaWQpOw0KQ1JFQVRFIElOREVYIGlkeF9zYV93YXlzX25ldF9saW5rX3RndF9yZGlkIE9OIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsgKHRhcmdldF9yb2FkX2lkKTsNCkFOQUxZWkUgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluazsNCg0KLS1zZXQgc291cmNlIGFuZCB0YXJnZXQgcm9hZHMNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICBzb3VyY2Vfcm9hZF9pZCA9IHNfdmVydC5yb2FkX2lkLA0KICAgICAgICB0YXJnZXRfcm9hZF9pZCA9IHRfdmVydC5yb2FkX2lkDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgc192ZXJ0LA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHRfdmVydA0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLnNvdXJjZV92ZXJ0ID0gc192ZXJ0LnZlcnRfaWQNCkFORCAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluay50YXJnZXRfdmVydCA9IHRfdmVydC52ZXJ0X2lkOw0KDQotLXNvdXJjZV9yb2FkX2Rpcg0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rDQpTRVQgICAgIHNvdXJjZV9yb2FkX2RpciA9IENBU0UgIFdIRU4gcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluay5pbnRfaWQgPSByb2FkLmludGVyc2VjdGlvbl90bw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAnZnQnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgJ3RmJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsuc291cmNlX3JvYWRfaWQgPSByb2FkLnJvYWRfaWQ7DQoNCi0tdGFyZ2V0X3JvYWRfZGlyDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsNClNFVCAgICAgdGFyZ2V0X3JvYWRfZGlyID0gQ0FTRSAgV0hFTiByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLmludF9pZCA9IHJvYWQuaW50ZXJzZWN0aW9uX3RvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICdmdCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAndGYnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHJvYWQNCldIRVJFICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluay50YXJnZXRfcm9hZF9pZCA9IHJvYWQucm9hZF9pZDsNCg0KLS1zZXQgYXppbXV0aHMgYW5kIHR1cm4gYW5nbGVzDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsNClNFVCAgICAgc291cmNlX3JvYWRfYXppID0gQ0FTRSAgV0hFTiBzb3VyY2Vfcm9hZF9kaXIgPSAndGYnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gZGVncmVlcyhTVF9BemltdXRoKFNUX0xpbmVJbnRlcnBvbGF0ZVBvaW50KHJvYWRzMS5nZW9tLDAuNSksU1RfU3RhcnRQb2ludChyb2FkczEuZ2VvbSkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIGRlZ3JlZXMoU1RfQXppbXV0aChTVF9MaW5lSW50ZXJwb2xhdGVQb2ludChyb2FkczEuZ2VvbSwwLjUpLFNUX0VuZFBvaW50KHJvYWRzMS5nZW9tKSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgdGFyZ2V0X3JvYWRfYXppID0gQ0FTRSAgV0hFTiB0YXJnZXRfcm9hZF9kaXIgPSAndGYnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gZGVncmVlcyhTVF9BemltdXRoKFNUX1N0YXJ0UG9pbnQocm9hZHMyLmdlb20pLFNUX0xpbmVJbnRlcnBvbGF0ZVBvaW50KHJvYWRzMi5nZW9tLDAuNSkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIGRlZ3JlZXMoU1RfQXppbXV0aChTVF9FbmRQb2ludChyb2FkczIuZ2VvbSksU1RfTGluZUludGVycG9sYXRlUG9pbnQocm9hZHMyLmdlb20sMC41KSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzMSwNCiAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczINCldIRVJFICAgc291cmNlX3JvYWRfaWQgPSByb2FkczEucm9hZF9pZA0KQU5EICAgICB0YXJnZXRfcm9hZF9pZCA9IHJvYWRzMi5yb2FkX2lkOw0KDQpVUERBVEUgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICB0dXJuX2FuZ2xlID0gKHRhcmdldF9yb2FkX2F6aSAtIHNvdXJjZV9yb2FkX2F6aSArIDM2MCkgJSAzNjA7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHNldCB0dXJuIGluZm8gLS0NCi0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGFzc3VtZSBjcm9zc2luZyBpcyB0cnVlIHVubGVzcyBwcm92ZW4gb3RoZXJ3aXNlDQpVUERBVEUgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayBTRVQgaW50X2Nyb3NzaW5nID0gVFJVRTsNCg0KLS0gc2V0IHJpZ2h0IHR1cm5zDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsNClNFVCAgICAgaW50X2Nyb3NzaW5nID0gRkFMU0UNCldIRVJFICAgbGlua19pZCA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgICAgIHIubGlua19pZA0KICAgICAgICAgICAgRlJPTSAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluayByDQogICAgICAgICAgICBXSEVSRSAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLnNvdXJjZV9yb2FkX2lkID0gci5zb3VyY2Vfcm9hZF9pZA0KICAgICAgICAgICAgQU5EICAgICAgICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluay5pbnRfaWQgPSByLmludF9pZA0KICAgICAgICAgICAgT1JERVIgQlkgICAgKHNpbihyYWRpYW5zKHIudHVybl9hbmdsZSkpPjApOjpJTlQgREVTQywNCiAgICAgICAgICAgICAgICAgICAgICAgIENBU0UgICAgV0hFTiBzaW4ocmFkaWFucyhyLnR1cm5fYW5nbGUpKT4wDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gY29zKHJhZGlhbnMoci50dXJuX2FuZ2xlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAtY29zKHJhZGlhbnMoci50dXJuX2FuZ2xlKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIEFTQw0KICAgICAgICAgICAgTElNSVQgICAgICAgMQ0KKTsNCg0KLS1zZXQgbGVuZ3Rocw0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rDQpTRVQgICAgIHNvdXJjZV9yb2FkX2xlbmd0aCA9IFNUX0xlbmd0aChyb2FkczEuZ2VvbSksDQogICAgICAgIHRhcmdldF9yb2FkX2xlbmd0aCA9IFNUX0xlbmd0aChyb2FkczIuZ2VvbSkNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkczEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZHMyDQpXSEVSRSAgIHNvdXJjZV9yb2FkX2lkID0gcm9hZHMxLnJvYWRfaWQNCkFORCAgICAgdGFyZ2V0X3JvYWRfaWQgPSByb2FkczIucm9hZF9pZDsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBzZXQgbGluayBzdHJlc3MgLS0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS1zb3VyY2Vfc3RyZXNzDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsNClNFVCAgICAgc291cmNlX3N0cmVzcyA9IENBU0UgV0hFTiByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLmludF9pZCA9IHJvYWQuaW50ZXJzZWN0aW9uX3RvIFRIRU4gcm9hZC5mdF9zZWdfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHJvYWQudGZfc2VnX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgcm9hZA0KV0hFUkUgICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLnNvdXJjZV9yb2FkX2lkID0gcm9hZC5yb2FkX2lkOw0KDQotLWludF9zdHJlc3MNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICBpbnRfc3RyZXNzID0gcm9hZHMuZnRfaW50X3N0cmVzcw0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsuc291cmNlX3JvYWRfaWQgPSByb2Fkcy5yb2FkX2lkDQpBTkQgICAgIHNvdXJjZV9yb2FkX2RpciA9ICdmdCc7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICBpbnRfc3RyZXNzID0gcm9hZHMudGZfaW50X3N0cmVzcw0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHJvYWRzDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsuc291cmNlX3JvYWRfaWQgPSByb2Fkcy5yb2FkX2lkDQpBTkQgICAgIHNvdXJjZV9yb2FkX2RpciA9ICd0Zic7DQoNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICBpbnRfc3RyZXNzID0gMQ0KV0hFUkUgICBOT1QgaW50X2Nyb3NzaW5nOzsNCg0KLS10YXJnZXRfc3RyZXNzDQpVUERBVEUgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsNClNFVCAgICAgdGFyZ2V0X3N0cmVzcyA9IENBU0UgICAgV0hFTiByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rLmludF9pZCA9IHJvYWQuaW50ZXJzZWN0aW9uX3RvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIHJvYWQudGZfc2VnX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHJvYWQuZnRfc2VnX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCkZST00gICAgcmVjZWl2ZWQuc2Ffd2F5cyByb2FkDQpXSEVSRSAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsudGFyZ2V0X3JvYWRfaWQgPSByb2FkLnJvYWRfaWQ7DQoNCi0tbGlua19zdHJlc3MNClVQREFURSAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaw0KU0VUICAgICBsaW5rX3N0cmVzcyA9IEdSRUFURVNUKHNvdXJjZV9zdHJlc3MsaW50X3N0cmVzcyx0YXJnZXRfc3RyZXNzKTsNCg0KLS0tLS0tLS0tLS0tLS0NCi0tIHNldCBjb3N0IC0tDQotLS0tLS0tLS0tLS0tLQ0KVVBEQVRFICByZWNlaXZlZC5zYV93YXlzX25ldF9saW5rDQpTRVQgICAgIGxpbmtfY29zdCA9IFJPVU5EKChzb3VyY2Vfcm9hZF9sZW5ndGggKyB0YXJnZXRfcm9hZF9sZW5ndGgpIC8gMik7DQoNCi0tIFJlbWFyazogd2hhdCBpcyB2ZXJ0X2Nvc3QgY3JlYXRlZCBhcyBhIGNvbHVtbiBvbiB0aGUgdmVydGljZXMgaWYgaXQgaXMgbm90IGdvaW5nIHRvIGJlIHVzZWQ/DQoNClNFTEVDVCAqIEZST00gcmVjZWl2ZWQuc2Ffd2F5cyBMSU1JVCAwOw0KYGBgDQoNCiMjIyA4LiBHZW5lcmF0ZSBwb3B1bGF0aW9uIGdyaWQNCg0KU28sIHRoaXMgaXMgb25lIG9mIHRoZSBtYWluIGRpZmZlcmVuY2VzIHJlZ2FyZGluZyB0aGUgUGZCIGFwcHJvYWNoIGFuZCBtaW5lLiBJbnN0ZWFkIG9mIHVzaW5nIFVTIGNlbnN1cyBibG9ja3MgSSB1c2VkIGEgcG9wdWxhdGlvbiBncmlkIG9mIDEga21eMl4gZm9yIHRoZSBlbnRpcmUgRXVyb3BlYW4gdGVycml0b3J5LiBTaW5jZSBpdHMgYXJlYSBpcyBxdWl0ZSBiaWcsIEkgY3JlYXRlZCBhIHN1YmRpdmlzaW9uIGNvZGUgdG8gc3BsaXQgdGhlIGRhdGEsIGNvbnNpZGVyaW5nIHBhcnRpYWwgcG9wdWxhdGlvbnMgZm9yIGVhY2ggbmV3IGNlbGwgZGVwZW5kaW5nIG9uIHRoZSBtb3RoZXIgY2VsbC4gVG8gZG8gdGhpcyBJIGZvbGxvd2VkIHR3byBzdGVwczoNCg0KIyMjIyAtIERvd25sb2FkIGRhdGEgZnJvbSBbRVVST1NUQVRdKGh0dHBzOi8vZWMuZXVyb3BhLmV1L2V1cm9zdGF0L3dlYi9naXNjby9nZW9kYXRhL3JlZmVyZW5jZS1kYXRhL3BvcHVsYXRpb24tZGlzdHJpYnV0aW9uLWRlbW9ncmFwaHkvZ2Vvc3RhdCkgYW5kIGxvYWQgaW50byBEQg0KDQpgYGB7cn0NCiMjIERvd25sb2FkIGRhdGEgYW5kIGxvYWQgdG8gUG9zdGdyZVNRTA0KaWYgKCFkYkV4aXN0c1RhYmxlKGNvbm5lY3Rpb24sIGMoInJlY2VpdmVkIiwiZ2Vvc3RhdCIpKSl7DQogIA0KICAjIENSRUFURSBBIE5FVyBURU1QT1JBTCBESVJFQ1RPUlkgVE8gRE9XTkxPQUQgVEhFIElORk8NCiAgY2QgPC0gZ2V0d2QoKQ0KICBpZmVsc2UoDQogICAgIWZpbGUuZXhpc3RzKGZpbGUucGF0aChjZCwndGVtcCcpKSwNCiAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChjZCwndGVtcCcpKSwgDQogICAgIkRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyINCiAgKQ0KICANCiAgIyBFU1RBQkxJU0ggVEhFIE5BTUUgT0YgVEhFIEZJTEUgV0hFUkUgVEhFIEdFT1NUQVQgREFUQSBXSUxMIEJFIERPV05MT0FERUQgQU5EIFVOWklQUEVEDQogIGdlb3N0YXRfZmlsZSA8LSBmaWxlLnBhdGgoY2QsJ3RlbXAnLCdnZW9zdGF0LnppcCcpDQogIGdlb3N0YXRfZXhkaXIgPC0gZmlsZS5wYXRoKGNkLCJ0ZW1wIiwiZ2Vvc3RhdCIpDQogIA0KICBpZiAoIWZpbGUuZXhpc3RzKGdlb3N0YXRfZXhkaXIpKXsNCiAgICAjIERFRklORSBUSEUgVVJMIEZST00gV0hFUkUgVEhFIERBVEEgQ09NRVMNCiAgDQogICAgZ2Vvc3RhdF91cmwgPC0gDQogICAgICAiaHR0cHM6Ly9lYy5ldXJvcGEuZXUvZXVyb3N0YXQvY2FjaGUvR0lTQ08vZ2VvZGF0YWZpbGVzL0dFT1NUQVQtZ3JpZC1QT1AtMUstMjAxMS1WMi0wLTEuemlwIg0KICAgIA0KICAgICMgRE9XTkxPQUQgVEhFIEZJTEUsIFVOWklQIElUIEFORCBERUxFVEUgLlpJUA0KICAgIA0KICAgIGxpYnJhcnkodXRpbHMpDQogICAgZG93bmxvYWQuZmlsZSh1cmwgPSBnZW9zdGF0X3VybCwgZGVzdGZpbGUgPSBnZW9zdGF0X2ZpbGUpDQogICAgdW56aXAoZ2Vvc3RhdF9maWxlLCBleGRpciA9IGdlb3N0YXRfZXhkaXIpDQogICAgZmlsZS5yZW1vdmUoZ2Vvc3RhdF9maWxlKQ0KICB9DQogIA0KICAjIENBTEwgREFUQSBJTlRPIFIgQU5EIFJFUFJPSkVDVA0KICBsaWJyYXJ5KHNmKQ0KICANCiAgdGFibGVfcGF0aCA8LSBmaWxlLnBhdGgoDQogICAgZ2Vvc3RhdF9leGRpciwNCiAgICAiVmVyc2lvbiAyXzBfMS9HRU9TVEFUX2dyaWRfUE9QXzFLXzIwMTFfVjJfMF8xLmNzdiINCiAgKQ0KICANCiAgZ3JpZF9wYXRoIDwtIGZpbGUucGF0aCgNCiAgICBnZW9zdGF0X2V4ZGlyLA0KICAgICJWZXJzaW9uIDJfMF8xL0dFT1NUQVRSZWZlcmVuY2VHcmlkL0dyaWRfRVRSUzg5X0xBRUFfMUstcmVmX0dFT1NUQVRfUE9QXzIwMTFfVjJfMF8xLnNocCINCiAgKQ0KICANCiAgcG9wX3RhYmxlIDwtIHN0X3JlYWQodGFibGVfcGF0aCkNCiAgbmFtZXMocG9wX3RhYmxlKSA8LSBwb3BfdGFibGUgJT4lIG5hbWVzKCkgJT4lIHRvbG93ZXIoKQ0KICANCiAgcG9wX2dyaWQgPC0gc3RfcmVhZChncmlkX3BhdGgpDQogIHBvcF9ncmlkX3QgPC0gcG9wX2dyaWQgJT4lIHN0X3RyYW5zZm9ybShjcnMgPSBzYV9jcnMpDQogIG5hbWVzKHBvcF9ncmlkX3QpIDwtIHBvcF9ncmlkX3QgJT4lIG5hbWVzKCkgJT4lIHRvbG93ZXIoKQ0KICANCiAgIyBMT0FEIFRPIFBPU1RHUkVTUUwNCiAgbGlicmFyeShzcWxkZikNCiAgc3FsZGYoDQogICAgIg0KICBEUk9QIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5wb3BfZ3JpZDsNCiAgRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQucG9wX3RhYmxlOw0KICAgICIsDQogIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uDQogICkNCiAgDQogIGRiV3JpdGVUYWJsZSgNCiAgICBjb25uID0gY29ubmVjdGlvbiwNCiAgICBuYW1lID0gYygicmVjZWl2ZWQiLCJwb3BfZ3JpZCIpLA0KICAgIHZhbHVlID0gcG9wX2dyaWRfdA0KICApDQogIA0KICBkYldyaXRlVGFibGUoDQogICAgY29ubiA9IGNvbm5lY3Rpb24sDQogICAgbmFtZSA9IGMoInJlY2VpdmVkIiwicG9wX3RhYmxlIiksDQogICAgdmFsdWUgPSBwb3BfdGFibGUNCiAgKQ0KICANCiAgIyMjIyBKb2luIHRhYmxlcyBvbiBkYXRhIGJhc2UgYW5kIGV4dHJhY3Qgc3R1ZHkgYXJlYQ0KICANCiAgc3FsZGYoDQogICAgIg0KLS0gQ3JlYXRlIGpvaW4gYmV0d2VlbiAuY3N2IGFuZCAuc2hwDQoNCkRST1AgVEFCTEUgSUYgRVhJU1RTIHJlY2VpdmVkLmdlb3N0YXQ7DQpEUk9QIElOREVYIElGIEVYSVNUUyByZWNlaXZlZC5nZW9zdGF0X2dlb21faWR4Ow0KDQpDUkVBVEUgVEFCTEUgcmVjZWl2ZWQuZ2Vvc3RhdCBBUw0KIFNFTEVDVCBncmlkLmdyZF9pZCwgZ3JpZC5nZW9tZXRyeSwgdGFiLnRvdF9wLCB0YWIuY250cl9jb2RlLCB0YWIueWVhciwgdGFiLnRvdF9wX2Nvbl9kdA0KICAgIEZST00gcmVjZWl2ZWQucG9wX2dyaWQgZ3JpZCwgcmVjZWl2ZWQucG9wX3RhYmxlIHRhYg0KICAgIFdIRVJFIGdyaWQuZ3JkX2lkID0gdGFiLmdyZF9pZDsNCg0KQ1JFQVRFIElOREVYIGdlb3N0YXRfZ2VvbV9pZHgNCiAgT04gcmVjZWl2ZWQuZ2Vvc3RhdA0KICBVU0lORyBnaXN0DQogIChnZW9tZXRyeSk7DQogIA0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQucG9wX2dyaWQ7DQpEUk9QIFRBQkxFIElGIEVYSVNUUyByZWNlaXZlZC5wb3BfdGFibGU7DQogICAgIiwNCiAgICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KICApDQp9IGVsc2Ugew0KICAiR0VPU1RBVCBkYXRhIGFscmVhZHkgbG9hZGVkIHRvIGRhdGFiYXNlLiINCn0NCmBgYA0KDQojIyMjIC0gR2VuZXJhdGUgc3ViZGl2aXNpb24gd2l0aCBhIGdyaWQsIGFkZGluZyBwYXJ0aWFsIHBvcHVsYXRpb24gYW5kIHVuaXF1ZSBJRA0KDQpgYGB7cn0NCnNxbGRmOjpzcWxkZigNCiAgIg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgcmVjZWl2ZWQuc2FfZ2Vvc3RhdDsNCkRST1AgSU5ERVggSUYgRVhJU1RTIHJlY2VpdmVkLnNhX2dlb3N0YXRfZ2VvbV9pZHg7DQoNCi0tIEV4dHJhY3QgdGhlIGdyaWRzIGNvbmNlcm5pbmcgb25seSB0aGUgc3R1ZHkgYXJlYQ0KDQpDUkVBVEUgVEFCTEUgcmVjZWl2ZWQuc2FfZ2Vvc3RhdCBBUw0KCVNFTEVDVCAJRElTVElOQ1QgZ2VvLmdyZF9pZCwgDQoJCQlDQVNUKGdlby50b3RfcCBBUyBJTlRFR0VSKSwgDQoJCQlnZW8uY250cl9jb2RlLCANCgkJCWdlby5nZW9tZXRyeQ0KCUZST00gcmVjZWl2ZWQuZ2Vvc3RhdCBnZW8sIHJlY2VpdmVkLnNhX3dheXMgdw0KIAlXSEVSRSBTVF9JbnRlcnNlY3RzKGdlby5nZW9tZXRyeSwgdy5nZW9tKTsNCg0KQ1JFQVRFIElOREVYIHNhX2dlb3N0YXRfZ2VvbV9pZHgNCiAgT04gcmVjZWl2ZWQuc2FfZ2Vvc3RhdA0KICBVU0lORyBnaXN0DQogIChnZW9tZXRyeSk7ICANCiAgIiwNCiAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24gDQopDQoNCiMjIEVzdGFibGlzaCBhIGZ1bmN0aW9uIHRvIGNyZWF0ZSBncmlkIHdpdGggZGlmZmVyZW50IG51bWJlciBvZiBzdWJkaXZpc2lvbnMsIGRlZmF1bHRzIHRvIDkNCg0KZ3JpZCA8LSBmdW5jdGlvbihzID0gOSl7DQogICMjIENhbGwgaXQgYXMgYW4gc2Ygb2JqZWN0IGFuZCB0aGVuIHRyYW5zZm9ybSBpdCB0byBDUlM6MzAzNSB0byBjcmVhdGUgZ3JpZA0KICBsaWJyYXJ5KHNmKQ0KICBsaWJyYXJ5KGRwbHlyLCBxdWlldGx5ID0gVFJVRSkNCiAgDQogIHNhX3BvcF8xa20yIDwtIHN0X3JlYWQoDQogICAgZHNuID0gY29ubmVjdGlvbiwNCiAgICBsYXllciA9IGMoInJlY2VpdmVkIiwgInNhX2dlb3N0YXQiKQ0KICApICU+JSANCiAgICBzdF90cmFuc2Zvcm0oY3JzID0gMzAzNSkNCiAgDQogICMjIERldGVybWluZSBudW1iZXIgb2YgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgY2VsbHMNCiAgaCA8LSBhcy5pbnRlZ2VyKGFzLm51bWVyaWMoZGlmZihzdF9iYm94KHNhX3BvcF8xa20yKVtjKDEsIDMpXSkpLzEwMDApDQogIHYgPC0gYXMuaW50ZWdlcihhcy5udW1lcmljKGRpZmYoc3RfYmJveChzYV9wb3BfMWttMilbYygyLCA0KV0pKS8xMDAwKQ0KICANCiAgIyMgTWFrZSBncmlkDQogIGdyaWQgPC0gc2FfcG9wXzFrbTIgJT4lIA0KICAgIHN0X21ha2VfZ3JpZChuPWMoaCpzcXJ0KHMpLHYqc3FydChzKSksIHdoYXQgPSAicG9seWdvbnMiKSAlPiUNCiAgICBzdF9zZigpICU+JSANCiAgICBtdXRhdGUoaWQgPSAxOm4oKSkgJT4lIA0KICAgIHN0X2ludGVyc2VjdGlvbihzYV9wb3BfMWttMikNCiAgDQogICMjIEZpbHRlciBncmlkIGJ5IGFyZWEgb2YgaW50ZXJzZWN0aW9uIGJlY2F1c2UgdGhlcmUgYXJlIHNtYWxsIHBvbHlnb25zIGNyZWF0ZWQuDQogIA0KICBncmlkJGFyZWEgPC0gZ3JpZCAlPiUgc3RfZ2VvbWV0cnkoKSAlPiUgc3RfYXJlYSgpICU+JSBhcy5udW1lcmljKCkNCiAgDQogIGdyaWQgPC0gZ3JpZCAlPiUgZmlsdGVyKGFyZWEgPiAxKQ0KICANCiAgZ3JpZCRhcmVhIDwtIE5VTEwNCiAgDQogIGdyaWQgPC0gd2l0aGluKGdyaWQsIGNlbGxfaWQgPC0gcGFzdGUoZ3JkX2lkLCJDIixpZCwgc2VwID0gIiIpKQ0KICANCiAgZ3JpZCRpZCA8LSBOVUxMDQogIA0KICBncmlkJHBhcnRpYWxfcCA8LSBncmlkJHRvdF9wL3MNCiAgDQogIGdyaWQgJT4lIHN0X3RyYW5zZm9ybShjcnMgPSBzYV9jcnMpDQp9DQoNCnNhX2dyaWQgPC0gZ3JpZChzID0gc3ViZGl2aXNpb25zKSAjIEFsd2F5cyBjb25zaWRlciBhIHNxdWFyZWQgbnVtYmVyIHRvIG1ha2UgYW4gZXZlbiBkaXZpc2lvbg0KDQpzcWxkZjo6c3FsZGYoDQogICJEUk9QIFRBQkxFIElGIEVYSVNUUyBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQiLA0KICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KKQ0KDQojIyBMb2FkIGRhdGEgaW50byBkYXRhIGJhc2UNClJQb3N0Z3JlU1FMOjpkYldyaXRlVGFibGUoDQogIGNvbm4gPSBjb25uZWN0aW9uLA0KICBuYW1lID0gYygiZ2VuZXJhdGVkIiwic2FfcG9wX2dyaWQiKSwNCiAgdmFsdWUgPSBzYV9ncmlkDQopDQoNCmxpYnJhcnkodG1hcCkNCnRtYXBfbW9kZSgidmlldyIpDQpxdG0oDQogIHNocCA9IHNhX2dyaWQsIA0KICBmaWxsID0gTlVMTCwgDQogIGJvcmRlcnMgPSAicmVkIiwgDQogIGJhc2VtYXBzID0gIk9wZW5TdHJlZXRNYXAiDQopDQpgYGANCg0KUGxvdHRpbmcgdGhlIGdyaWQgb24gdGhpcyBzdGVwIGNhbiBhbGxvdyB0aGUgYW5hbHlzdCBkZWNpZGUgb24gYSBiZXR0ZXIgbnVtYmVyIG9mIHN1YmRpdmlzaW9ucywgZGVwZW5kaW5nIG9uIHRoZSBzdHVkeSBhcmVhLiBJIGhvcGUgdG8gYXV0b21hdGl6ZSB0aGlzIG9uIGEgbGF0ZXIgZWZmb3J0LiANCg0KIyMjIyAtIFByZXBhcmUgdGhlIHBvcHVsYXRpb24gZ3JpZCB0YWJsZQ0KDQpUaGlzIHN0ZXAgaXMgb25seSBnZW5lcmF0aW5nIG5ldyBjb2x1bW5zIG9uIG15IG5ldyBQb3B1bGF0aW9uIEdyaWQgdGFibGUuIEl0IGZvbGxvd3MgdGhlIHNhbWUgbG9naWMgYXMgdGhlIFBmQiBhbmQgdGhlcmVmb3JlIHdvbid0IGJlIGlubGN1ZGVkIG9uIHRoaXMgZG9jdW1lbnQgZXhwbGljaXRlbHkuIA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHJvYWRfaWRzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBwb3BfbG93X3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgcG9wX2hpZ2hfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBwb3Bfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGVtcF9sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBlbXBfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGVtcF9zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgc2Nob29sc19sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBzY2hvb2xzX2hpZ2hfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBzY2hvb2xzX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyB1bml2ZXJzaXRpZXNfbG93X3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyB1bml2ZXJzaXRpZXNfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGNvbGxlZ2VzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGNvbGxlZ2VzX2hpZ2hfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBjb2xsZWdlc19zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgZG9jdG9yc19sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBkb2N0b3JzX2hpZ2hfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBkb2N0b3JzX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBkZW50aXN0c19sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBkZW50aXN0c19oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgZGVudGlzdHNfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGhvc3BpdGFsc19sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBob3NwaXRhbHNfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGhvc3BpdGFsc19zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgcGhhcm1hY2llc19sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBwaGFybWFjaWVzX2hpZ2hfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBwaGFybWFjaWVzX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyByZXRhaWxfbG93X3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgcmV0YWlsX2hpZ2hfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyByZXRhaWxfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHN1cGVybWFya2V0c19sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHN1cGVybWFya2V0c19zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgc29jaWFsX3NlcnZpY2VzX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBwYXJrc19sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyBwYXJrc19oaWdoX3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgcGFya3Nfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHRyYWlsc19sb3dfc3RyZXNzOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyB0cmFpbHNfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHRyYWlsc19zY29yZTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzczsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIGNvbW11bml0eV9jZW50ZXJzX3Njb3JlOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyB0cmFuc2l0X2xvd19zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHRyYW5zaXRfaGlnaF9zdHJlc3M7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIHRyYW5zaXRfc2NvcmU7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgRFJPUCBDT0xVTU4gSUYgRVhJU1RTIG92ZXJhbGxfc2NvcmU7DQoNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHJvYWRfaWRzIElOVEVHRVJbXTsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHBvcF9sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHBvcF9oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBwb3Bfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBlbXBfbG93X3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBlbXBfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gZW1wX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gc2Nob29sc19sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHNjaG9vbHNfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gc2Nob29sc19zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHVuaXZlcnNpdGllc19sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiB1bml2ZXJzaXRpZXNfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBjb2xsZWdlc19sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGNvbGxlZ2VzX2hpZ2hfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGNvbGxlZ2VzX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gZG9jdG9yc19sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGRvY3RvcnNfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gZG9jdG9yc19zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIGRlbnRpc3RzX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gZGVudGlzdHNfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gZGVudGlzdHNfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBob3NwaXRhbHNfbG93X3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBob3NwaXRhbHNfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gaG9zcGl0YWxzX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcGhhcm1hY2llc19sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcGhhcm1hY2llc19zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHJldGFpbF9sb3dfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHJldGFpbF9oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiByZXRhaWxfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBzdXBlcm1hcmtldHNfbG93X3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gc3VwZXJtYXJrZXRzX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHNvY2lhbF9zZXJ2aWNlc19zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHBhcmtzX2xvd19zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcGFya3NfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gcGFya3Nfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiB0cmFpbHNfbG93X3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiB0cmFpbHNfaGlnaF9zdHJlc3MgSU5UOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gdHJhaWxzX3Njb3JlIEZMT0FUOw0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIEFERCBDT0xVTU4gY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBjb21tdW5pdHlfY2VudGVyc19zY29yZSBGTE9BVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHRyYW5zaXRfbG93X3N0cmVzcyBJTlQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiB0cmFuc2l0X2hpZ2hfc3RyZXNzIElOVDsNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBBREQgQ09MVU1OIHRyYW5zaXRfc2NvcmUgRkxPQVQ7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiBvdmVyYWxsX3Njb3JlIEZMT0FUOw0KDQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQ0Kc3FsZGYoDQogICINCi0tIGluZGV4ZXMNCkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9zYV9wb3BfZ3JpZF9jZWxsX2lkIE9OIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCAoY2VsbF9pZCk7DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfc2FfcG9wX2dyaWRfZ2VvbSBPTiBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgVVNJTkcgR0lTVCAoZ2VvbWV0cnkpOw0KQU5BTFlaRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQogICIsDQogIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uDQopDQpgYGANCg0KYGBge3NxbCBhZGRfcm9hZF9pZHMsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0UsIG91dHB1dC52YXIgPSAib3V0cHV0In0NCg0KQUxURVIgVEFCTEUgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIERST1AgQ09MVU1OIElGIEVYSVNUUyB0bXBfZ2VvbV9idWZmZXI7DQpBTFRFUiBUQUJMRSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgQUREIENPTFVNTiB0bXBfZ2VvbV9idWZmZXIgZ2VvbWV0cnkobXVsdGlwb2x5Z29uLCA/c2FfY3JzKTsNCg0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgdG1wX2dlb21fYnVmZmVyID0gU1RfTXVsdGkoU1RfQnVmZmVyKGdlb21ldHJ5LDUpKTsNCkNSRUFURSBJTkRFWCB0c2lkeF9zYV9wb3BfZ3JpZF9jZWxsaWRidWZmZ2VvbXMgT04gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFVTSU5HIEdJU1QgKHRtcF9nZW9tX2J1ZmZlcik7DQpBTkFMWVpFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCAodG1wX2dlb21fYnVmZmVyKTsNCg0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgcm9hZF9pZHMgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIHdheXMucm9hZF9pZA0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHdheXMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQudG1wX2dlb21fYnVmZmVyLHdheXMuZ2VvbSkNCiAgICAgICAgICAgIEFORCAgICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU1RfQ29udGFpbnMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLnRtcF9nZW9tX2J1ZmZlcix3YXlzLmdlb20pDQogICAgICAgICAgICAgICAgICAgIE9SICBTVF9MZW5ndGgoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RfSW50ZXJzZWN0aW9uKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC50bXBfZ2VvbV9idWZmZXIsd2F5cy5nZW9tKQ0KICAgICAgICAgICAgICAgICAgICAgICAgKSA+IDEwDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKSk7DQoNCkFMVEVSIFRBQkxFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBEUk9QIENPTFVNTiBJRiBFWElTVFMgdG1wX2dlb21fYnVmZmVyOw0KDQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQ0Kc3FsZGYoDQogICINCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggYWlkeF9zYV9wb3BfZ3JpZF9yb2FkX2lkcyBPTiBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgVVNJTkcgR0lOIChyb2FkX2lkcyk7DQpBTkFMWVpFIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCAocm9hZF9pZHMpOw0KICAiLA0KICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KKQ0KYGBgDQoNCiMjIyA5LiBSZWFjaGFibGUgcm9hZHMgc2NyaXB0cw0KDQpUaGlzIGlzIHRoZSBjb3JlIG9mIHRoZSB3aG9sZSBCTkEgYW5hbHlzaXMsIHdoZXJlIHRoZSBhY3R1YWwgbmV0d29yayBhbmFseXNpcyBpcyBwZXJmb3JtZWQuIFRoaXMgc3RlcCBtaWdodCB0YWtlIHNvbWUgY29tcHV0YXRpb24gdGltZS4gSXQgaXMgYWdhaW4gdGhlIHNhbWUgYXMgUGZCLCBhbmQgY2FuIGJlIHJldmlld2VkIHdpdGggbW9yZSBkZXRhaWwgb24gdGhlICpSbWQqIGZpbGUuIEl0IGJhc2ljYWxseSB1c2VzICpwZ3JvdXRpbmcqLCB0aGVyZWZvcmUgdGhlIERpamtzdHJhIGFsZ29yaXRobSB0byBjb21wdXRlIHRoZSAqKmRyaXZpbmcgZGlzdGFuY2UqKiBjb25zaWRlcmluZyB0aGUgY29uZmlndXJhdGlvbiBlc3RhYmxpc2hlZCBvbiBzdGVwIDcuIEl0IGRvZXMgaXQgZm9yIHRoZSB0d28gbGV2ZWxzIG9mIHRyYWZmaWMgc3RyZXNzOg0KDQojIyMjIyA+IEhpZ2ggc3RyZXNzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfaGlnaF9zdHJlc3M7DQoNCkNSRUFURSBUQUJMRSBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2hpZ2hfc3RyZXNzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgYmFzZV9yb2FkIElOVCwNCiAgICB0YXJnZXRfcm9hZCBJTlQsDQogICAgdG90YWxfY29zdCBGTE9BVA0KKTsNCg0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2hpZ2hfc3RyZXNzOw0KYGBgDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfaGlnaF9zdHJlc3MgKA0KICAgIGJhc2Vfcm9hZCwNCiAgICB0YXJnZXRfcm9hZCwNCiAgICB0b3RhbF9jb3N0DQopDQpTRUxFQ1QgIHIxLnJvYWRfaWQsDQogICAgICAgIHYyLnJvYWRfaWQsDQogICAgICAgIHNoZWRzLmFnZ19jb3N0DQpGUk9NICAgIHJlY2VpdmVkLnNhX3dheXMgcjEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdjEsDQogICAgICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X3ZlcnQgdjIsDQogICAgICAgIHBncl9kcml2aW5nRGlzdGFuY2UoJw0KICAgICAgICAgICAgU0VMRUNUICBsaW5rX2lkIEFTIGlkLA0KICAgICAgICAgICAgICAgICAgICBzb3VyY2VfdmVydCBBUyBzb3VyY2UsDQogICAgICAgICAgICAgICAgICAgIHRhcmdldF92ZXJ0IEFTIHRhcmdldCwNCiAgICAgICAgICAgICAgICAgICAgbGlua19jb3N0IEFTIGNvc3QNCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2Ffd2F5c19uZXRfbGluaycsDQogICAgICAgICAgICB2MS52ZXJ0X2lkLA0KICAgICAgICAgICAgP2Jpa2luZ19kaXN0YW5jZSwgLS12YWx1ZSB1c2VkIGluIFBmQiBhcHByb2FjaCwgbWlnaHQgY2hhbmdlIGxhdGVyLCBpdCBpcyBpbiBtZXRlcnMgYW5kIGFzc3VtZXMgYSBtYXggMTAgbWludXRlIHRyaXAgYXQgMTBtcGgNCiAgICAgICAgICAgIGRpcmVjdGVkIDo9IHRydWUNCiAgICAgICAgKSBzaGVkcw0KLS1XSEVSRSByMS5yb2FkX2lkICUgOnRocmVhZF9udW0gPSA6dGhyZWFkX25vDQotLUFORA0KV0hFUkUNCkVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGIuZ2VvbWV0cnkscjEuZ2VvbSkNCikNCkFORCAgICAgcjEucm9hZF9pZCA9IHYxLnJvYWRfaWQNCkFORCAgICAgdjIudmVydF9pZCA9IHNoZWRzLm5vZGU7DQoNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19oaWdoX3N0cmVzczsNCmBgYA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpDUkVBVEUgVU5JUVVFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3NhX3JjaGJscmRzaGlzdHJzc19iIE9OIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfaGlnaF9zdHJlc3MgKGJhc2Vfcm9hZCwgdGFyZ2V0X3JvYWQpOw0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3NhX3JjaGJscmRzaGlzdHJzc190IE9OIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfaGlnaF9zdHJlc3MgKHRhcmdldF9yb2FkKTsNCg0KLS0gY2hlY2sgb24gdGhpcywgZG9lcyBub3Qgd29yayBnb29kIGJlY2F1c2U6IEtleSAoYmFzZV9yb2FkLCB0YXJnZXRfcm9hZCk9KDE3OTgsIDMxOTMpIGlzIGR1cGxpY2F0ZWQuDQpgYGANCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0NCmxpYnJhcnkoc3FsZGYpDQpzcWxkZigNCiAgIg0KVkFDVVVNIEFOQUxZWkUgZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19oaWdoX3N0cmVzczsNCiAgIiwNCiAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24NCikNCg0KIyMgSSBydW4gdGhpcyB3aXRoIHRoZSBsaWJyYXJ5IGJlY2F1c2UgUiBkb2VzIG5vdCBhbGxvdyBzcWwgY29kZSB3aXRob3V0IHNlbGVjdCBvdXRwdXQNCiMjIEFsc28sIFNRTCBkb2VzIG5vdCBhbGxvdyB0byBydW4gYSBWQUNVVU0gQU5BTFlaRSBhcyBhIHNlcmllcyBvZiBxdWVyaWVzLCBzbyBpdCBoYXMgdG8gYmUgYWxvbmUuIA0KYGBgDQoNCiMjIyMjID4gTG93IHN0cmVzcw0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19sb3dfc3RyZXNzOw0KDQpDUkVBVEUgVEFCTEUgZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19sb3dfc3RyZXNzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgYmFzZV9yb2FkIElOVCwNCiAgICB0YXJnZXRfcm9hZCBJTlQsDQogICAgdG90YWxfY29zdCBGTE9BVA0KKTsNCg0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2xvd19zdHJlc3M7DQpgYGANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19sb3dfc3RyZXNzICgNCiAgICBiYXNlX3JvYWQsDQogICAgdGFyZ2V0X3JvYWQsDQogICAgdG90YWxfY29zdA0KKQ0KU0VMRUNUICByMS5yb2FkX2lkLA0KICAgICAgICB2Mi5yb2FkX2lkLA0KICAgICAgICBzaGVkcy5hZ2dfY29zdA0KRlJPTSAgICByZWNlaXZlZC5zYV93YXlzIHIxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHYxLA0KICAgICAgICByZWNlaXZlZC5zYV93YXlzX25ldF92ZXJ0IHYyLA0KICAgICAgICBwZ3JfZHJpdmluZ0Rpc3RhbmNlKCcNCiAgICAgICAgICAgIFNFTEVDVCAgbGlua19pZCBBUyBpZCwNCiAgICAgICAgICAgICAgICAgICAgc291cmNlX3ZlcnQgQVMgc291cmNlLA0KICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdmVydCBBUyB0YXJnZXQsDQogICAgICAgICAgICAgICAgICAgIGxpbmtfY29zdCBBUyBjb3N0DQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX3dheXNfbmV0X2xpbmsNCiAgICAgICAgICAgIFdIRVJFICAgbGlua19zdHJlc3MgPSAxJywNCiAgICAgICAgICAgIHYxLnZlcnRfaWQsDQogICAgICAgICAgICA/YmlraW5nX2Rpc3RhbmNlLA0KICAgICAgICAgICAgZGlyZWN0ZWQgOj0gdHJ1ZQ0KICAgICAgICApIHNoZWRzDQotLVdIRVJFIHIxLnJvYWRfaWQgJSA6dGhyZWFkX251bSA9IDp0aHJlYWRfbm8NCi0tQU5EDQpXSEVSRQ0KRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoYi5nZW9tZXRyeSxyMS5nZW9tKQ0KKQ0KQU5EICAgICByMS5yb2FkX2lkID0gdjEucm9hZF9pZA0KQU5EICAgICB2Mi52ZXJ0X2lkID0gc2hlZHMubm9kZTsNCg0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2xvd19zdHJlc3M7DQpgYGANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3NhX3JjaGJscmRzbG93c3Ryc3NfYiBPTiBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2xvd19zdHJlc3MgKGJhc2Vfcm9hZCk7DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfc2FfcmNoYmxyZHNsb3dzdHJzc190IE9OIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfbG93X3N0cmVzcyAodGFyZ2V0X3JvYWQpOw0KDQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfbG93X3N0cmVzczsNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQ0KbGlicmFyeShzcWxkZikNCnNxbGRmKA0KICAiDQpWQUNVVU0gQU5BTFlaRSBnZW5lcmF0ZWQuc2FfcmVhY2hhYmxlX3JvYWRzX2xvd19zdHJlc3MgKGJhc2Vfcm9hZCx0YXJnZXRfcm9hZCk7DQogICIsDQogIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uDQopDQoNCiMjIEkgcnVuIHRoaXMgd2l0aCB0aGUgbGlicmFyeSBiZWNhdXNlIFIgZG9lcyBub3QgYWxsb3cgc3FsIGNvZGUgd2l0aG91dCBzZWxlY3Qgb3V0cHV0DQojIyBBbHNvLCBTUUwgZG9lcyBub3QgYWxsb3cgdG8gcnVuIGEgVkFDVVVNIEFOQUxZWkUgYXMgYSBzZXJpZXMgb2YgcXVlcmllcywgc28gaXQgaGFzIHRvIGJlIGFsb25lLiANCmBgYA0KDQojIyMgMTAuIEVzdGFibGlzaCBjb25uZWN0ZWQgcG9wdWxhdGlvbiBncmlkcyBhbmQgY29tcHV0ZSB0aGVpciBhY2Nlc3NpYmlsaXR5DQoNCk9uIHRoaXMgc3RlcCBiYXNpY2FsbHkgZm91ciBwcm9jZWR1cmVzIHRha2UgcGxhY2U6DQoNCiMjIyMgLSBDb25uZWN0IHBvcHVsYXRpb24gZ3JpZHMNCg0KV2hlcmUgYSBuZXcgdGFibGUgYHNhX2Nvbm5lY3RlZF9wb3BfZ3JpZGAgaXMgY3JlYXRlZCB0byBzdW1tYXJpemUgdGhlIGNvbm5lY3RlZCBjZWxscyBieSBlc3RhYmxpc2hpbmcgdGhlbSBhcyBzb3VyY2UgYW5kIHRhcmdldCwgaW5jbHVkaW5nIGlmIHRoZXkgYXJlIGNvbm5lY3RlZCBieSB0aGUgbG93IG9yIGhpZ2ggc3RyZXNzIG5ldHdvcmssIGFuZCBvYnRhaW5pbmcgdGhlIG1pbmltdW0gdGhlIGNvc3RzIGJldHdlZW4gY2VsbHMuIA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkOw0KDQpDUkVBVEUgVEFCTEUgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCAoDQogICAgaWQgU0VSSUFMIFBSSU1BUlkgS0VZLA0KICAgIHNvdXJjZV9jZWxsaWQgVkFSQ0hBUigxOCksDQogICAgdGFyZ2V0X2NlbGxpZCBWQVJDSEFSKDE4KSwNCiAgICBsb3dfc3RyZXNzIEJPT0xFQU4sDQogICAgbG93X3N0cmVzc19jb3N0IElOVCwNCiAgICBoaWdoX3N0cmVzcyBCT09MRUFOLA0KICAgIGhpZ2hfc3RyZXNzX2Nvc3QgSU5UDQopOw0KDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkICgNCiAgICBzb3VyY2VfY2VsbGlkLCB0YXJnZXRfY2VsbGlkLA0KICAgIGxvd19zdHJlc3MsIGxvd19zdHJlc3NfY29zdCwgaGlnaF9zdHJlc3MsIGhpZ2hfc3RyZXNzX2Nvc3QNCikNClNFTEVDVCAgc291cmNlLmNlbGxfaWQsDQogICAgICAgIHRhcmdldC5jZWxsX2lkLA0KICAgICAgICBGQUxTRSwNCiAgICAgICAgKA0KICAgICAgICAgICAgU0VMRUNUICBNSU4obHMudG90YWxfY29zdCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19sb3dfc3RyZXNzIGxzDQogICAgICAgICAgICBXSEVSRSAgIGxzLmJhc2Vfcm9hZCA9IEFOWShzb3VyY2Uucm9hZF9pZHMpDQogICAgICAgICAgICBBTkQgICAgIGxzLnRhcmdldF9yb2FkID0gQU5ZKHRhcmdldC5yb2FkX2lkcykNCiAgICAgICAgKSwNCiAgICAgICAgVFJVRSwNCiAgICAgICAgKA0KICAgICAgICAgICAgU0VMRUNUICBNSU4oaHMudG90YWxfY29zdCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19sb3dfc3RyZXNzIGhzIC0tVGhleSB0YWtlIGl0IGZyb20gdGhlIGxvdyBzdHJlc3MgYmVjYXVzZSB0aGVzZSByb2FkcyBjYW4gYWxzbyBiZSBhY2Nlc3NlZCBieSBjYXJzLiBEb2luZyBpdCB3aXRoIGhpZ2ggc3RyZXNzIHRha2VzIGEgbG90IG9mIHRpbWUgYmVjYXVzZSB0aGV5IGFyZSBsaWtlIDIgbWlsbGlvbiByZWNvcmRzLCB3aGlsZSBsb3cgYXJlIDMwMCB0aG91c2FuZC4gVGhpcyBpcyB3aHkgdGhleSB1cGRhdGUgYWZ0ZXJ3YXJkcy4gDQogICAgICAgICAgICBXSEVSRSAgIGhzLmJhc2Vfcm9hZCA9IEFOWShzb3VyY2Uucm9hZF9pZHMpDQogICAgICAgICAgICBBTkQgICAgIGhzLnRhcmdldF9yb2FkID0gQU5ZKHRhcmdldC5yb2FkX2lkcykNCiAgICAgICAgKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgc291cmNlLA0KICAgICAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgdGFyZ2V0LA0KICAgICAgICByZWNlaXZlZC5zYV9ib3VuZGFyeQ0KV0hFUkUgICBTVF9JbnRlcnNlY3RzKHNvdXJjZS5nZW9tZXRyeSxyZWNlaXZlZC5zYV9ib3VuZGFyeS5nZW9tZXRyeSkNCkFORCAgICAgU1RfRFdpdGhpbihzb3VyY2UuZ2VvbWV0cnksdGFyZ2V0Lmdlb21ldHJ5LD9iaWtpbmdfZGlzdGFuY2UpOw0KDQotLSBzZXQgbG93X3N0cmVzcw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQpTRVQgICAgIGxvd19zdHJlc3MgPSBUUlVFDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIHNvdXJjZSwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIHRhcmdldA0KICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBzb3VyY2UuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSB0YXJnZXQuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBzb3VyY2Uucm9hZF9pZHMgJiYgdGFyZ2V0LnJvYWRfaWRzDQogICAgICAgICkNCk9SICAgICAgKA0KICAgICAgICAgICAgbG93X3N0cmVzc19jb3N0IElTIE5PVCBOVUxMDQogICAgICAgIEFORCBDQVNFICAgIFdIRU4gQ09BTEVTQ0UoaGlnaF9zdHJlc3NfY29zdCwwKSA9IDAgVEhFTiBUUlVFDQogICAgICAgICAgICAgICAgICAgIEVMU0UgbG93X3N0cmVzc19jb3N0OjpGTE9BVCAvIGhpZ2hfc3RyZXNzX2Nvc3QgPD0gMS4yNQ0KICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgKTsNCiAgICAgICAgDQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0NCmxpYnJhcnkoc3FsZGYpDQpzcWxkZigNCiAgIg0KLS0gaW5kZXhlcw0KQ1JFQVRFIFVOSVFVRSBJTkRFWCBpZHhfc2FfY2VsbHBhaXJzIE9OIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgKHNvdXJjZV9jZWxsaWQsdGFyZ2V0X2NlbGxpZCk7DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfc2FfY2VsbHBhaXJzX2xzdHJlc3MgT04gZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCAobG93X3N0cmVzcykgV0hFUkUgbG93X3N0cmVzcyBJUyBUUlVFOw0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3NhX2NlbGxwYWlyc19oc3RyZXNzIE9OIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgKGhpZ2hfc3RyZXNzKSBXSEVSRSBoaWdoX3N0cmVzcyBJUyBUUlVFOw0KQU5BTFlaRSBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkOw0KICAiLA0KICBjb25uZWN0aW9uID0gY29ubmVjdGlvbg0KKQ0KIyMgSSBydW4gdGhpcyB3aXRoIHRoZSBsaWJyYXJ5IGJlY2F1c2UgUiBkb2VzIG5vdCBhbGxvdyBzcWwgY29kZSB3aXRob3V0IHNlbGVjdCBvdXRwdXQNCiMjIEFsc28sIFNRTCBkb2VzIG5vdCBhbGxvdyB0byBydW4gYSBWQUNVVU0gQU5BTFlaRSBhcyBhIHNlcmllcyBvZiBxdWVyaWVzLCBzbyBpdCBoYXMgdG8gYmUgYWxvbmUuIA0KYGBgDQoNCiMjIyMgLSBDb21wdXRlIHBvcHVsYXRpb24gYWNjZXNzDQoNClRoZSBhY2Nlc3MgY29tcHV0YXRpb24gb24gdGhpcyBzdGVwIGZpbGxzIHVwIHRoZSBgc2FfcG9wX2dyaWRgIHRhYmxlIGNyZWF0ZWQgb24gKnN0ZXAgOCosIGFjY29yZGluZyB0byB0aGUgW1BmQiBtZXRob2RvbG9neV0oaHR0cHM6Ly9ibmEucGVvcGxlZm9yYmlrZXMub3JnLyMvbWV0aG9kb2xvZ3kpLg0KDQpUbyBjb21wdXRlIGFjY2VzcyBvbiB0aGlzIGFuIHRoZSBuZXh0IHN0ZXAsIGEgd2VpZ2h0aW5nIHByb2NlZHVyZSBpcyB1c2VkLCBhcyB0aGUgbWV0aG9kb2xvZ3kgb2YgUGZCIGRvZXMsIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBbaGVyZV0oaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL3BmYi1wdWJsaWMtZG9jdW1lbnRzL1Njb3JpbmcuY2F0ZWdvcmllcy54bHN4KS4gDQoNCkEgcXVpY2sgZ2xhbmNlIG9mIHRoZSB3ZWlnaHRzIHVzZWQsIG1haW5seSBmb3IgKnN0ZXAgMTEqOg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KdGJsIDwtIGRhdGEuZnJhbWUoDQogIHNjb3JjYXQgPSBjZWxsX3NwZWMoDQogICAgYygNCiAgICAgIHJlcCgiUGVvcGxlID0gMTUiLDEpLA0KICAgICAgcmVwKCJPcHBvcnR1bml0eSA9IDIwIiw0KSwNCiAgICAgIHJlcCgiQ29yZSBTZXJ2aWNlcyA9IDIwIiw2KSwNCiAgICAgIHJlcCgiUmVjcmVhdGlvbiA9IDE1IiwzKSwNCiAgICAgIHJlcCgiUmV0YWlsID0gMTUiLDEpLA0KICAgICAgcmVwKCJUcmFuc2l0ID0gMTUiLDEpDQogICAgKQ0KICApLA0KICBtZWFzdXJlID0gY2VsbF9zcGVjKA0KICAgIGMoDQogICAgICAiUG9wdWxhdGlvbiA9IE4vQSIsDQogICAgICAiRW1wbG95bWVudCA9IDM1IiwNCiAgICAgICJLLTEyIEVkdWNhdGlvbiA9IDM1IiwNCiAgICAgICJUZWNobmljYWwvdm9jYXRpb25hbCBzY2hvb2wgPSAxMCIsDQogICAgICAiSGlnaGVyIEVkdWNhdGlvbiA9IDIwIiwNCiAgICAgICJEb2N0b3Igb2ZmaWNlcy9jbGluaWNzID0gMjAiLA0KICAgICAgIkRlbnRpc3Qgb2ZmaWNlcyA9IDEwIiwNCiAgICAgICJIb3NwaXRhbHMgPSAyMCIsDQogICAgICAiUGhhcm1hY2llcyA9IDEwIiwNCiAgICAgICJTdXBlcm1hcmtldHMgPSAyNSIsDQogICAgICAiU29jaWFsIHNlcnZpY2VzID0gMTUiLA0KICAgICAgIlBhcmtzID0gNDAiLA0KICAgICAgIlJlY3JlYXRpb25hbCB0cmFpbHMgPSAzNSIsDQogICAgICAiQ29tbXVuaXR5IGNlbnRlcnMgPSAyNSIsDQogICAgICAiUmV0YWlsIHNob3BwaW5nID0gTi9BIiwNCiAgICAgICJTdGF0aW9uL3RyYW5zaXQgY2VudGVycyA9IE4vQSINCiAgICApDQogICkNCikNCg0KY29sbmFtZXModGJsKSA8LSBjKCJTY29yaW5nIENhdGVnb3J5IiwgIk1lYXN1cmUiKQ0KDQprYWJsZSh0YmwsIGFsaWduID0gImMiLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCAiYm9yZGVyZWQiLCBmb250X3NpemUgPSAxMCwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICBjb2xsYXBzZV9yb3dzKGNvbHVtbnMgPSAxLCB2YWxpZ24gPSAidG9wIikNCmBgYA0KDQpJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoaXMgcmVwcm9kdWN0aW9uIG9mIHRoZSBCTkEgZm9yIEV1cm9wZSBkb2VzIG5vdCBpbmNsdWRlICplbXBsb3ltZW50KiBkYXRhLCBhcyB1bnRpbCBub3csIEkgaGF2ZSBub3QgbG9jYXRlZCBhIHNvdXJjZSB0byBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24gYXMgb3BlbiBkYXRhIGZvciB0aGUgd2hvbGUgRXVyb3BlLiBUaGVyZWZvcmUsIHRoZSBmaW5hbCByZXN1bHRzIHdpbGwgc2hvdyB0aGlzIGNhdGVnb3J5IGJ1dCB3aXRoIDAgb3IgTkEgdmFsdWVzLiANCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0NCiMjIEVzdGFibGlzaCB2YXJpYWJsZXMgdG8gZ2l2ZSBzY29yZXMgdG8gcG9wdWxhdGlvbiBhY2Nlc3MuIA0KbWF4X3Njb3JlID0gMQ0Kc3RlcDEgPSAwLjAzDQpzY29yZTEgPSAwLjENCnN0ZXAyID0gMC4yDQpzY29yZTIgPSAwLjQNCnN0ZXAzID0gMC41DQpzY29yZTMgPSAwLjgNCmBgYA0KDQpgYGB7c3FsIHBvcCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gbG93IHN0cmVzcyBhY2Nlc3MNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oYmxvY2tzMi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBibG9ja3MyDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBjYi5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgY2IudGFyZ2V0X2NlbGxpZCA9IGJsb2NrczIuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBjYi5sb3dfc3RyZXNzDQogICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGJsb2NrczIucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgYmxvY2tzMg0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2INCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgY2Iuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGNiLnRhcmdldF9jZWxsaWQgPSBibG9ja3MyLmNlbGxfaWQNCiAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gcG9wX2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgIFdIRU4gP3N0ZXAxID0gMCBUSEVOID9tYXhfc2NvcmUgKiBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MgPSA/c3RlcDMgVEhFTiA/c2NvcmUzDQogICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzID0gP3N0ZXAyIFRIRU4gP3Njb3JlMg0KICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcyA9ID9zdGVwMSBUSEVOID9zY29yZTENCiAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MgPiA/c3RlcDMNCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP3Njb3JlMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICg/bWF4X3Njb3JlIC0gP3Njb3JlMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzIC0gP3N0ZXAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoMSAtID9zdGVwMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcyA+ID9zdGVwMg0KICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/c2NvcmUyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKD9zY29yZTMgLSA/c2NvcmUyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MgLSA/c3RlcDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICg/c3RlcDMgLSA/c3RlcDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MgPiA/c3RlcDENCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP3Njb3JlMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICg/c2NvcmUyIC0gP3Njb3JlMSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzIC0gP3N0ZXAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoP3N0ZXAyIC0gP3N0ZXAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgID9zY29yZTENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyA/c3RlcDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBFTkQ7DQogICAgICAgICAgICAgICAgICAgIA0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7ICAgICAgICAgICAgICAgICAgICANCmBgYA0KDQojIyMjIC0gRXh0cmFjdCBjb21tb24gZGVzdGluYXRpb25zIA0KDQpXaGljaCB1c2VzIHRoZSBvc20gcG9seWdvbnMgYW5kIHBvaW50cyBnZW5lcmF0ZWQgYnkgYG9zbTJwZ3NxbGAuIFRoZSBkZXN0aW5hdGlvbnMgaW5jbHVkZWQgYXJlOg0KDQpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQ0KY2x1c3Rlcl9jb2xsZWdlcyA9IDEwMA0KY2x1c3Rlcl9jb21tdW5pdHlfY2VudGVycyA9IDUwDQpjbHVzdGVyX2RvY3RvcnMgPSA1MA0KY2x1c3Rlcl9kZW50aXN0cyA9IDUwDQpjbHVzdGVyX2hvc3BpdGFscyA9IDUwDQpjbHVzdGVyX3BoYXJtYWNpZXMgPSA1MA0KY2x1c3Rlcl9wYXJrcyA9IDUwDQpjbHVzdGVyX3JldGFpbCA9IDUwDQpjbHVzdGVyX3RyYW5zaXQgPSA3NQ0KY2x1c3Rlcl91bml2ZXJzaXRpZXMgPSAxNTANCmBgYA0KDQojIyMjIyA+IENvbGxlZ2VzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlczsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyAoDQogICAgaWQgU0VSSUFMIFBSSU1BUlkgS0VZLA0KICAgIGNlbGxfaWQgQ0hBUkFDVEVSIFZBUllJTkcoMTgpW10sDQogICAgb3NtX2lkIEJJR0lOVCwNCiAgICBjb2xsZWdlX25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KG11bHRpcG9seWdvbiwgP3NhX2NycykNCik7DQoNCi0tIGluc2VydCBwb2x5Z29ucw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9jb2xsZWdlcykpLDMpLDApKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb24NCldIRVJFICAgYW1lbml0eSA9ICdjb2xsZWdlJzsNCg0KLS0gc2V0IHBvaW50cyBvbiBwb2x5Z29ucw0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNClNFVCAgICAgZ2VvbV9wdCA9IFNUX0NlbnRyb2lkKGdlb21fcG9seSk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9jb2xsZWdlc19nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyAoDQogICAgb3NtX2lkLCBjb2xsZWdlX25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5ID0gJ2NvbGxlZ2UnDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyBzDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMocy5nZW9tX3BvbHkscmVjZWl2ZWQuc2FfZnVsbF9wb2ludC53YXkpDQogICAgICAgICk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9jb2xsZWdlc19nZW9tcHQgT04gZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMgKGdlb21fcHQpOw0KDQotLSBzZXQgY2VsbF9pZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMNClNFVCAgICAgY2VsbF9pZCA9IGFycmF5KCgNCiAgICAgICAgICAgIFNFTEVDVCAgY2IuY2VsbF9pZA0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2INCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcy5nZW9tX3B0LGNiLmdlb21ldHJ5KQ0KICAgICAgICApKTsNCg0KLS0gYmxvY2sgaW5kZXgNCkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGFpZHhfZGVzdGluYXRpb25zX3NhX2NvbGxlZ2VzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcyAoY2VsbF9pZCk7DQoNClNFTEVDVCAqIEZST00gZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzOw0KYGBgDQoNCiMjIyMjID4gQ29tbXVuaXR5IGNlbnRlcnMNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnM7DQoNCkNSRUFURSBUQUJMRSBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgY2VudGVyX25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KG11bHRpcG9seWdvbiwgP3NhX2NycykNCik7DQoNCi0tIGluc2VydCBwb2x5Z29ucw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9jb21tdW5pdHlfY2VudGVycykpLDMpLDApKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb24NCldIRVJFICAgYW1lbml0eSBJTiAoJ2NvbW11bml0eV9jZW50cmUnLCdjb21tdW5pdHlfY2VudGVyJyk7DQoNCi0tIHNldCBwb2ludHMgb24gcG9seWdvbnMNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzDQpTRVQgICAgIGdlb21fcHQgPSBTVF9DZW50cm9pZChnZW9tX3BvbHkpOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfY29tbXVuaXR5X2NlbnRlcnNfZ2VvbXBseSBPTiBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMgVVNJTkcgR0lTVCAoZ2VvbV9wb2x5KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzIChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMgKA0KICAgIG9zbV9pZCwgY2VudGVyX25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5IElOICgnY29tbXVuaXR5X2NlbnRyZScsJ2NvbW11bml0eV9jZW50ZXInKQ0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5KQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfY29tbXVuaXR5X2NlbnRlcnNfZ2VvbXB0IE9OIGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzIChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX2NvbW11bml0eV9jZW50ZXJzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycyAoY2VsbF9pZCk7DQoNClNFTEVDVCAqIEZST00gZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzOw0KYGBgDQoNCiMjIyMjID4gRGVudGlzdHMNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzOw0KDQpDUkVBVEUgVEFCTEUgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIGRlbnRpc3RzX25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KG11bHRpcG9seWdvbiwgP3NhX2NycykNCik7DQoNCi0tIGluc2VydCBwb2x5Z29ucw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9kZW50aXN0cykpLDMpLDApKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb24NCldIRVJFICAgYW1lbml0eSA9ICdkZW50aXN0JzsNCg0KLS0gc2V0IHBvaW50cyBvbiBwb2x5Z29ucw0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMNClNFVCAgICAgZ2VvbV9wdCA9IFNUX0NlbnRyb2lkKGdlb21fcG9seSk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9kZW50aXN0c19nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cyBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cyAoDQogICAgb3NtX2lkLCBkZW50aXN0c19uYW1lLCBnZW9tX3B0DQopDQpTRUxFQ1QgIG9zbV9pZCwNCiAgICAgICAgbmFtZSwNCiAgICAgICAgd2F5DQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQNCldIRVJFICAgYW1lbml0eSA9ICdkZW50aXN0Jw0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5KQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfZGVudGlzdHNfZ2VvbXB0IE9OIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzIChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX2RlbnRpc3RzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cyAoY2VsbF9pZCk7DQoNClNFTEVDVCAqIEZST00gZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzOw0KDQpgYGANCg0KIyMjIyMgPiBEb2N0b3JzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzOw0KDQpDUkVBVEUgVEFCTEUgZGVzdGluYXRpb25zLnNhX2RvY3RvcnMgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgZG9jdG9yc19uYW1lIFRFWFQsDQogICAgcG9wX2xvd19zdHJlc3MgSU5ULA0KICAgIHBvcF9oaWdoX3N0cmVzcyBJTlQsDQogICAgcG9wX3Njb3JlIEZMT0FULA0KICAgIGdlb21fcHQgZ2VvbWV0cnkocG9pbnQsID9zYV9jcnMpLA0KICAgIGdlb21fcG9seSBnZW9tZXRyeShtdWx0aXBvbHlnb24sID9zYV9jcnMpDQopOw0KDQotLSBpbnNlcnQgcG9seWdvbnMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9kb2N0b3JzKSksMyksMCkpDQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9seWdvbg0KV0hFUkUgICBhbWVuaXR5IElOICgnY2xpbmljJywnZG9jdG9ycycpOw0KDQotLSBzZXQgcG9pbnRzIG9uIHBvbHlnb25zDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzDQpTRVQgICAgIGdlb21fcHQgPSBTVF9DZW50cm9pZChnZW9tX3BvbHkpOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfZG9jdG9yc19nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzIFVTSU5HIEdJU1QgKGdlb21fcG9seSk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzIChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycyAoDQogICAgb3NtX2lkLCBkb2N0b3JzX25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5IElOICgnY2xpbmljJywnZG9jdG9ycycpDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX2RvY3RvcnNfZ2VvbXB0IE9OIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2RvY3RvcnMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9kb2N0b3JzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX2RvY3RvcnMgVVNJTkcgR0lOIChjZWxsX2lkKTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2RvY3RvcnMgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2FfZG9jdG9yczsNCmBgYA0KDQojIyMjIyA+IEhvc3BpdGFscyANCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFsczsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgaG9zcGl0YWxfbmFtZSBURVhULA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkobXVsdGlwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0IHBvbHlnb25zDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9ob3NwaXRhbHMpKSwzKSwwKSkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgSU4gKCdob3NwaXRhbHMnLCdob3NwaXRhbCcpOw0KDQotLSBzZXQgcG9pbnRzIG9uIHBvbHlnb25zDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMNClNFVCAgICAgZ2VvbV9wdCA9IFNUX0NlbnRyb2lkKGdlb21fcG9seSk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9ob3NwaXRhbHNfZ2VvbXBseSBPTiBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzIFVTSU5HIEdJU1QgKGdlb21fcG9seSk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgKA0KICAgIG9zbV9pZCwgaG9zcGl0YWxfbmFtZSwgZ2VvbV9wdA0KKQ0KU0VMRUNUICBvc21faWQsDQogICAgICAgIG5hbWUsDQogICAgICAgIHdheQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50DQpXSEVSRSAgIGFtZW5pdHkgSU4gKCdob3NwaXRhbHMnLCdob3NwaXRhbCcpDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5KQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfaG9zcGl0YWxzX2dlb21wdCBPTiBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzIChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscw0KU0VUICAgICBjZWxsX2lkID0gYXJyYXkoKA0KICAgICAgICAgICAgU0VMRUNUICBjYi5jZWxsX2lkDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX2hvc3BpdGFsc19jZWxsX2lkIE9OIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMgVVNJTkcgR0lOIChjZWxsX2lkKTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscyAoY2VsbF9pZCk7DQpTRUxFQ1QgKiBGUk9NIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHM7DQpgYGANCg0KIyMjIyMgPiBQYXJrcw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2FfcGFya3M7DQoNCkNSRUFURSBUQUJMRSBkZXN0aW5hdGlvbnMuc2FfcGFya3MgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgcGFya19uYW1lIFRFWFQsDQogICAgcG9wX2xvd19zdHJlc3MgSU5ULA0KICAgIHBvcF9oaWdoX3N0cmVzcyBJTlQsDQogICAgcG9wX3Njb3JlIEZMT0FULA0KICAgIGdlb21fcHQgZ2VvbWV0cnkocG9pbnQsID9zYV9jcnMpLA0KICAgIGdlb21fcG9seSBnZW9tZXRyeShtdWx0aXBvbHlnb24sID9zYV9jcnMpDQopOw0KDQotLSBpbnNlcnQgcG9seWdvbnMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9wYXJrcyAoDQogICAgZ2VvbV9wb2x5DQopDQpTRUxFQ1QgIFNUX011bHRpKFNUX0J1ZmZlcihTVF9Db2xsZWN0aW9uRXh0cmFjdCh1bm5lc3QoU1RfQ2x1c3RlcldpdGhpbih3YXksP2NsdXN0ZXJfcGFya3MpKSwzKSwwKSkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgPSAncGFyaycNCiAgICAgICAgT1IgbGVpc3VyZSA9ICdwYXJrJw0KICAgICAgICBPUiBsZWlzdXJlID0gJ25hdHVyZV9yZXNlcnZlJw0KICAgICAgICBPUiBsZWlzdXJlID0gJ3BsYXlncm91bmQnOw0KDQotLSBzZXQgcG9pbnRzIG9uIHBvbHlnb25zDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KU0VUICAgICBnZW9tX3B0ID0gU1RfQ2VudHJvaWQoZ2VvbV9wb2x5KTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3BhcmtzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3BhcmtzIFVTSU5HIEdJU1QgKGdlb21fcG9seSk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9wYXJrcyAoZ2VvbV9wb2x5KTsNCg0KLS0gaW5zZXJ0IHBvaW50cw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX3BhcmtzICgNCiAgICBvc21faWQsIHBhcmtfbmFtZSwgZ2VvbV9wdA0KKQ0KU0VMRUNUICBvc21faWQsDQogICAgICAgIG5hbWUsDQogICAgICAgIHdheQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50DQpXSEVSRSAgICgNCiAgICAgICAgICAgIGFtZW5pdHkgPSAncGFyaycNCiAgICAgICAgT1IgIGxlaXN1cmUgPSAncGFyaycNCiAgICAgICAgT1IgIGxlaXN1cmUgPSAnbmF0dXJlX3Jlc2VydmUnDQogICAgICAgIE9SICBsZWlzdXJlID0gJ3BsYXlncm91bmQnDQogICAgICAgICkNCkFORCAgICAgTk9UIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3BhcmtzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3BhcmtzX2dlb21wdCBPTiBkZXN0aW5hdGlvbnMuc2FfcGFya3MgVVNJTkcgR0lTVCAoZ2VvbV9wdCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9wYXJrcyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KU0VUICAgICBjZWxsX2lkID0gYXJyYXkoKA0KICAgICAgICAgICAgU0VMRUNUICBjYi5jZWxsX2lkDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9wYXJrcy5nZW9tX3BvbHksY2IuZ2VvbWV0cnkpDQogICAgICAgICAgICBPUiAgICAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BhcmtzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9wYXJrc19jZWxsX2lkIE9OIGRlc3RpbmF0aW9ucy5zYV9wYXJrcyBVU0lORyBHSU4gKGNlbGxfaWQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfcGFya3MgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2FfcGFya3M7DQpgYGANCg0KIyMjIyMgPiBQaGFybWFjaWVzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzOw0KDQpDUkVBVEUgVEFCTEUgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIG9zbV9pZCBCSUdJTlQsDQogICAgcGhhcm1hY3lfbmFtZSBURVhULA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkobXVsdGlwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0IHBvbHlnb25zDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcyAoDQogICAgZ2VvbV9wb2x5DQopDQpTRUxFQ1QgIFNUX011bHRpKFNUX0J1ZmZlcihTVF9Db2xsZWN0aW9uRXh0cmFjdCh1bm5lc3QoU1RfQ2x1c3RlcldpdGhpbih3YXksP2NsdXN0ZXJfcGhhcm1hY2llcykpLDMpLDApKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvbHlnb24NCldIRVJFICAgYW1lbml0eSA9ICdwaGFybWFjeSc7DQoNCi0tIHNldCBwb2ludHMgb24gcG9seWdvbnMNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMNClNFVCAgICAgZ2VvbV9wdCA9IFNUX0NlbnRyb2lkKGdlb21fcG9seSk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9waGFybWFjaWVzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMgVVNJTkcgR0lTVCAoZ2VvbV9wb2x5KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzICgNCiAgICBvc21faWQsIHBoYXJtYWN5X25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5ID0gJ3BoYXJtYWN5Jw0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcyBzDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMocy5nZW9tX3BvbHkscmVjZWl2ZWQuc2FfZnVsbF9wb2ludC53YXkpDQogICAgICAgICk7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9waGFybWFjaWVzX2dlb21wdCBPTiBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMgKGdlb21fcHQpOw0KDQotLSBzZXQgY2VsbF9pZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcw0KU0VUICAgICBjZWxsX2lkID0gYXJyYXkoKA0KICAgICAgICAgICAgU0VMRUNUICBjYi5jZWxsX2lkDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcy5nZW9tX3B0LGNiLmdlb21ldHJ5KQ0KICAgICAgICApKTsNCg0KLS0gYmxvY2sgaW5kZXgNCkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGFpZHhfc2FfcGhhcm1hY2llc19jZWxsX2lkIE9OIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzIChjZWxsX2lkKTsNClNFTEVDVCAqIEZST00gZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXM7DQpgYGANCg0KIyMjIyMgPiBSZXRhaWwNCg0KYGBge3NxbCwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZGVzdGluYXRpb25zLnNhX3JldGFpbDsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwgKA0KICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwNCiAgICBjZWxsX2lkIENIQVJBQ1RFUiBWQVJZSU5HKDE4KVtdLA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkobXVsdGlwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0DQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl9yZXRhaWwpKSwzKSwwKSkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGxhbmR1c2UgPSAncmV0YWlsJzsNCg0KLS0gc2V0IHBvaW50cyBvbiBwb2x5Z29ucw0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQpTRVQgICAgIGdlb21fcHQgPSBTVF9DZW50cm9pZChnZW9tX3BvbHkpOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfcmV0YWlsX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3JldGFpbCBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsIChnZW9tX3BvbHkpOw0KDQotLSBzZXQgY2VsbF9pZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3JldGFpbC5nZW9tX3BvbHksY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9yZXRhaWxfY2VsbF9pZCBPTiBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsOw0KYGBgDQoNCiMjIyMjID4gU2Nob29scw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2Ffc2Nob29sczsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIHNjaG9vbF9uYW1lIFRFWFQsDQogICAgcG9wX2xvd19zdHJlc3MgSU5ULA0KICAgIHBvcF9oaWdoX3N0cmVzcyBJTlQsDQogICAgcG9wX3Njb3JlIEZMT0FULA0KICAgIGdlb21fcHQgZ2VvbWV0cnkocG9pbnQsID9zYV9jcnMpLA0KICAgIGdlb21fcG9seSBnZW9tZXRyeShwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0IHBvaW50cyBmcm9tIHBvbHlnb25zDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scyAoDQogICAgb3NtX2lkLCBzY2hvb2xfbmFtZSwgZ2VvbV9wdCwgZ2VvbV9wb2x5DQopDQpTRUxFQ1QgIG9zbV9pZCwNCiAgICAgICAgbmFtZSwNCiAgICAgICAgU1RfQ2VudHJvaWQod2F5KSwNCiAgICAgICAgd2F5DQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9seWdvbg0KV0hFUkUgICBhbWVuaXR5ID0gJ3NjaG9vbCc7DQoNCi0tIHJlbW92ZSBzdWJhcmVhcyB0aGF0IGFyZSBtaXN0YWtlbmx5IGRlc2lnbmF0ZWQgYXMgYW1lbml0eT1zY2hvb2wNCkRFTEVURSBGUk9NIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9Db250YWlucyhzLmdlb21fcG9seSxkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5nZW9tX3BvbHkpDQogICAgICAgICAgICBBTkQgICAgIHMuaWQgIT0gZGVzdGluYXRpb25zLnNhX3NjaG9vbHMuaWQNCik7DQoNCi0tIGluZGV4DQpDUkVBVEUgSU5ERVggc2lkeF9zYV9zY2hvb2xzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgVVNJTkcgR0lTVCAoZ2VvbV9wb2x5KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgKGdlb21fcG9seSk7DQoNCi0tIGluc2VydCBwb2ludHMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzICgNCiAgICBvc21faWQsIHNjaG9vbF9uYW1lLCBnZW9tX3B0DQopDQpTRUxFQ1QgIG9zbV9pZCwNCiAgICAgICAgbmFtZSwNCiAgICAgICAgd2F5DQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQNCldIRVJFICAgYW1lbml0eSA9ICdzY2hvb2wnDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3NjaG9vbHNfZ2VvbXB0IE9OIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzDQpTRVQgICAgIGNlbGxfaWQgPSBhcnJheSgoDQogICAgICAgICAgICBTRUxFQ1QgIGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3NjaG9vbHMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9zY2hvb2xzX2NlbGxfaWQgT04gZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgVVNJTkcgR0lOIChjZWxsX2lkKTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2Ffc2Nob29sczsNCmBgYA0KDQojIyMjIyA+IFNvY2lhbCBzZXJ2aWNlcw0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzOw0KDQpDUkVBVEUgVEFCTEUgZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcyAoDQogICAgaWQgU0VSSUFMIFBSSU1BUlkgS0VZLA0KICAgIGNlbGxfaWQgQ0hBUkFDVEVSIFZBUllJTkcoMTgpW10sDQogICAgb3NtX2lkIEJJR0lOVCwNCiAgICBzZXJ2aWNlX25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KHBvbHlnb24sID9zYV9jcnMpDQopOw0KDQotLSBpbnNlcnQgcG9pbnRzIGZyb20gcG9seWdvbnMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMgKA0KICAgIG9zbV9pZCwgc2VydmljZV9uYW1lLCBnZW9tX3B0LCBnZW9tX3BvbHkNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICBTVF9DZW50cm9pZCh3YXkpLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgPSAnc29jaWFsX2ZhY2lsaXR5JzsNCg0KLS0gcmVtb3ZlIHN1YmFyZWFzIHRoYXQgYXJlIGFscmVhZHkgY292ZXJlZA0KREVMRVRFIEZST00gZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9Db250YWlucyhzLmdlb21fcG9seSxkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmdlb21fcG9seSkNCiAgICAgICAgICAgIEFORCAgICAgcy5pZCAhPSBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmlkDQopOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2Ffc29jaWFsX3NlcnZpY2VzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcyBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzIChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzICgNCiAgICBvc21faWQsIHNlcnZpY2VfbmFtZSwgZ2VvbV9wdA0KKQ0KU0VMRUNUICBvc21faWQsDQogICAgICAgIG5hbWUsDQogICAgICAgIHdheQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50DQpXSEVSRSAgIGFtZW5pdHkgPSAnc29jaWFsX2ZhY2lsaXR5Jw0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3NvY2lhbF9zZXJ2aWNlc19nZW9tcHQgT04gZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMNClNFVCAgICAgY2VsbF9pZCA9IGFycmF5KCgNCiAgICAgICAgICAgIFNFTEVDVCAgY2IuY2VsbF9pZA0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2INCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9zb2NpYWxfc2VydmljZXNfY2VsbF9pZCBPTiBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzOw0KYGBgDQoNCiMjIyMjID4gU3VwZXJtYXJrZXRzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHM7DQoNCkNSRUFURSBUQUJMRSBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIHN1cGVybWFya2V0X25hbWUgVEVYVCwNCiAgICBwb3BfbG93X3N0cmVzcyBJTlQsDQogICAgcG9wX2hpZ2hfc3RyZXNzIElOVCwNCiAgICBwb3Bfc2NvcmUgRkxPQVQsDQogICAgZ2VvbV9wdCBnZW9tZXRyeShwb2ludCwgP3NhX2NycyksDQogICAgZ2VvbV9wb2x5IGdlb21ldHJ5KHBvbHlnb24sID9zYV9jcnMpDQopOw0KDQotLSBpbnNlcnQgcG9pbnRzIGZyb20gcG9seWdvbnMNCklOU0VSVCBJTlRPIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMgKA0KICAgIG9zbV9pZCwgc3VwZXJtYXJrZXRfbmFtZSwgZ2VvbV9wdCwgZ2VvbV9wb2x5DQopDQpTRUxFQ1QgIG9zbV9pZCwNCiAgICAgICAgbmFtZSwNCiAgICAgICAgU1RfQ2VudHJvaWQod2F5KSwNCiAgICAgICAgd2F5DQpGUk9NICAgIHJlY2VpdmVkLnNhX2Z1bGxfcG9seWdvbg0KV0hFUkUgICBzaG9wID0gJ3N1cGVybWFya2V0JzsNCg0KLS0gcmVtb3ZlIHN1YmFyZWFzIHRoYXQgYXJlIGFscmVhZHkgY292ZXJlZA0KREVMRVRFIEZST00gZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9Db250YWlucyhzLmdlb21fcG9seSxkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmdlb21fcG9seSkNCiAgICAgICAgICAgIEFORCAgICAgcy5pZCAhPSBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmlkDQopOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2Ffc3VwZXJtYXJrZXRzX2dlb21wbHkgT04gZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cyBVU0lORyBHSVNUIChnZW9tX3BvbHkpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzIChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzICgNCiAgICBvc21faWQsIHN1cGVybWFya2V0X25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBzaG9wID0gJ3N1cGVybWFya2V0Jw0KQU5EICAgICBOT1QgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzIHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhzLmdlb21fcG9seSxyZWNlaXZlZC5zYV9mdWxsX3BvaW50LndheSkNCiAgICAgICAgKTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3N1cGVybWFya2V0c19nZW9tcHQgT04gZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cyBVU0lORyBHSVNUIChnZW9tX3B0KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cyAoZ2VvbV9wdCk7DQoNCi0tIHNldCBjZWxsX2lkDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMNClNFVCAgICAgY2VsbF9pZCA9IGFycmF5KCgNCiAgICAgICAgICAgIFNFTEVDVCAgY2IuY2VsbF9pZA0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2INCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmdlb21fcG9seSxjYi5nZW9tZXRyeSkNCiAgICAgICAgICAgIE9SICAgICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmdlb21fcHQsY2IuZ2VvbWV0cnkpDQogICAgICAgICkpOw0KDQotLSBibG9jayBpbmRleA0KQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYWlkeF9zYV9zdXBlcm1hcmtldHNfY2VsbF9pZCBPTiBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzIFVTSU5HIEdJTiAoY2VsbF9pZCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMgKGNlbGxfaWQpOw0KU0VMRUNUICogRlJPTSBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzOw0KYGBgDQoNCiMjIyMjID4gVHJhbnNpdA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQpEUk9QIFRBQkxFIElGIEVYSVNUUyBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdDsNCg0KQ1JFQVRFIFRBQkxFIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0ICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIHRyYW5zaXRfbmFtZSBURVhULA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkocG9seWdvbiwgP3NhX2NycykNCik7DQoNCi0tIGluc2VydCBwb2ludHMgZnJvbSBwb2x5Z29ucw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX3RyYW5zaXQgKA0KICAgIG9zbV9pZCwgdHJhbnNpdF9uYW1lLCBnZW9tX3B0LCBnZW9tX3BvbHkNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICBTVF9DZW50cm9pZCh3YXkpLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgPSAnYnVzX3N0YXRpb24nDQpPUiAgICAgIHJhaWx3YXkgPSAnc3RhdGlvbicNCk9SICAgICAgcHVibGljX3RyYW5zcG9ydCA9ICdzdGF0aW9uJzsNCg0KLS0gcmVtb3ZlIHN1YmFyZWFzDQpERUxFVEUgRlJPTSBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0IHMNCiAgICAgICAgICAgIFdIRVJFICAgU1RfQ29udGFpbnMocy5nZW9tX3BvbHksZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuZ2VvbV9wb2x5KQ0KICAgICAgICAgICAgQU5EICAgICBzLmlkICE9IGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0LmlkDQopOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfdHJhbnNpdF9nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0IFVTSU5HIEdJU1QgKGdlb21fcG9seSk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0IChnZW9tX3BvbHkpOw0KDQotLSBpbnNlcnQgcG9pbnRzDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdCAoDQogICAgZ2VvbV9wdA0KKQ0KU0VMRUNUICBTVF9DZW50cm9pZChTVF9Db2xsZWN0aW9uRXh0cmFjdCh1bm5lc3QoU1RfQ2x1c3RlcldpdGhpbih3YXksP2NsdXN0ZXJfdHJhbnNpdCkpLDEpKQ0KRlJPTSAgICByZWNlaXZlZC5zYV9mdWxsX3BvaW50DQpXSEVSRSAgICgNCiAgICAgICAgICAgIGFtZW5pdHkgPSAnYnVzX3N0YXRpb24nDQogICAgICAgIE9SICByYWlsd2F5ID0gJ3N0YXRpb24nDQogICAgICAgIE9SICBwdWJsaWNfdHJhbnNwb3J0ID0gJ3N0YXRpb24nDQogICAgICAgICkNCkFORCAgICAgTk9UIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3RyYW5zaXQgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9EV2l0aGluKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5LDUwKQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfdHJhbnNpdF9nZW9tcHQgT04gZGVzdGluYXRpb25zLnNhX3RyYW5zaXQgVVNJTkcgR0lTVCAoZ2VvbV9wdCk7DQpBTkFMWVpFIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0IChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3RyYW5zaXQNClNFVCAgICAgY2VsbF9pZCA9IGFycmF5KCgNCiAgICAgICAgICAgIFNFTEVDVCAgY2IuY2VsbF9pZA0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2INCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdC5nZW9tX3BvbHksY2IuZ2VvbWV0cnkpDQogICAgICAgICAgICBPUiAgICAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX3RyYW5zaXRfY2VsbF9pZCBPTiBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdCBVU0lORyBHSU4gKGNlbGxfaWQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdCAoY2VsbF9pZCk7DQpTRUxFQ1QgKiBGUk9NIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0Ow0KYGBgDQoNCiMjIyMjID4gVW5pdmVyc2l0aWVzDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCkRST1AgVEFCTEUgSUYgRVhJU1RTIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXM7DQoNCkNSRUFURSBUQUJMRSBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgY2VsbF9pZCBDSEFSQUNURVIgVkFSWUlORygxOClbXSwNCiAgICBvc21faWQgQklHSU5ULA0KICAgIGNvbGxlZ2VfbmFtZSBURVhULA0KICAgIHBvcF9sb3dfc3RyZXNzIElOVCwNCiAgICBwb3BfaGlnaF9zdHJlc3MgSU5ULA0KICAgIHBvcF9zY29yZSBGTE9BVCwNCiAgICBnZW9tX3B0IGdlb21ldHJ5KHBvaW50LCA/c2FfY3JzKSwNCiAgICBnZW9tX3BvbHkgZ2VvbWV0cnkobXVsdGlwb2x5Z29uLCA/c2FfY3JzKQ0KKTsNCg0KLS0gaW5zZXJ0IHBvbHlnb25zDQpJTlNFUlQgSU5UTyBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzICgNCiAgICBnZW9tX3BvbHkNCikNClNFTEVDVCAgU1RfTXVsdGkoU1RfQnVmZmVyKFNUX0NvbGxlY3Rpb25FeHRyYWN0KHVubmVzdChTVF9DbHVzdGVyV2l0aGluKHdheSw/Y2x1c3Rlcl91bml2ZXJzaXRpZXMpKSwzKSwwKSkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2x5Z29uDQpXSEVSRSAgIGFtZW5pdHkgPSAndW5pdmVyc2l0eSc7DQoNCi0tIHNldCBwb2ludHMgb24gcG9seWdvbnMNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcw0KU0VUICAgICBnZW9tX3B0ID0gU1RfQ2VudHJvaWQoZ2VvbV9wb2x5KTsNCg0KLS0gaW5kZXgNCkNSRUFURSBJTkRFWCBzaWR4X3NhX3VuaXZlcnNpdGllc19nZW9tcGx5IE9OIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMgVVNJTkcgR0lTVCAoZ2VvbV9wb2x5KTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcyAoZ2VvbV9wb2x5KTsNCg0KLS0gaW5zZXJ0IHBvaW50cw0KSU5TRVJUIElOVE8gZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcyAoDQogICAgb3NtX2lkLCBjb2xsZWdlX25hbWUsIGdlb21fcHQNCikNClNFTEVDVCAgb3NtX2lkLA0KICAgICAgICBuYW1lLA0KICAgICAgICB3YXkNCkZST00gICAgcmVjZWl2ZWQuc2FfZnVsbF9wb2ludA0KV0hFUkUgICBhbWVuaXR5ID0gJ3VuaXZlcnNpdHknDQpBTkQgICAgIE5PVCBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMgcw0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKHMuZ2VvbV9wb2x5LHJlY2VpdmVkLnNhX2Z1bGxfcG9pbnQud2F5KQ0KICAgICAgICApOw0KDQotLSBpbmRleA0KQ1JFQVRFIElOREVYIHNpZHhfc2FfdW5pdmVyc2l0aWVzX2dlb21wdCBPTiBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzIFVTSU5HIEdJU1QgKGdlb21fcHQpOw0KQU5BTFlaRSBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzIChnZW9tX3B0KTsNCg0KLS0gc2V0IGNlbGxfaWQNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcw0KU0VUICAgICBjZWxsX2lkID0gYXJyYXkoKA0KICAgICAgICAgICAgU0VMRUNUICBjYi5jZWxsX2lkDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuZ2VvbV9wb2x5LGNiLmdlb21ldHJ5KQ0KICAgICAgICAgICAgT1IgICAgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuZ2VvbV9wdCxjYi5nZW9tZXRyeSkNCiAgICAgICAgKSk7DQoNCi0tIGJsb2NrIGluZGV4DQpDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBhaWR4X3NhX3VuaXZlcnNpdGllc19jZWxsX2lkIE9OIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMgVVNJTkcgR0lOIChjZWxsX2lkKTsNCkFOQUxZWkUgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcyAoY2VsbF9pZCk7DQpTRUxFQ1QgKiBGUk9NIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXM7DQpgYGANCg0KIyMjIyAtIENvbXB1dGUgYWNjZXNzIHRvIGNvbW1vbiBkZXN0aW5hdGlvbnMNCg0KV2hlcmUgdGhlIGFjY2VzcyB0byB0aGUgZGVzdGluYXRpb25zIGVzdGFibGlzaGVkIGJlZm9yZSBpcyBjb21wdXRlZC4gQWNjZXNzIHRvIHJlY3JlYXRpb25hbCB0cmFpbHMgYW5kIGJpa2UgcGF0aHMgaXMgYWxzbyBpbmNsdWRlZC4NCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0NCg0KbWF4X3Njb3JlID0gMQ0KDQojIyBTY29yZXMgZmlyc3QgZ3JvdXA6IGNvbGxlZ2VzLCBob3NwaXRhbHMsIHNvY2lhbCBzZXJ2aWNlcywgdW5pdmVyc2l0aWVzDQpBZmlyc3QgPSAwLjcNCkFzZWNvbmQgPSAwDQpBdGhpcmQgPSAwDQoNCiMjIFNjb3JlcyBzZWNvbmQgZ3JvdXA6IGNvbW11bml0eSBjZW50ZXJzLCBkZW50aXN0cywgcGhhcm1hY2llcywgcmV0YWlsDQpCZmlyc3QgPSAwLjQgDQpCc2Vjb25kID0gMC4yIA0KQnRoaXJkID0gMC4xIA0KDQojIyBTY29yZXMgdGhpcmQgZ3JvdXA6IHBhcmtzLCBzY2hvb2xzDQpDZmlyc3QgPSAwLjMgDQpDc2Vjb25kID0gMC4yIA0KQ3RoaXJkID0gMC4yIA0KDQojIyBTY29yZXMgZm91cnRoIGdyb3VwOiBzdXBlcm1hcmtldHMNCkRmaXJzdCA9IDAuNiANCkRzZWNvbmQgPSAwLjIgDQpEdGhpcmQgPSAwDQoNCiMjIFNjb3JlcyBmaWZ0aCBncm91cDogdHJhaWxzDQpFZmlyc3QgPSAwLjcgDQpFc2Vjb25kID0gMC4yIA0KRXRoaXJkID0gMA0KbWluX3BhdGhfbGVuZ3RoPTQ4MDAgDQptaW5fYmJveF9sZW5ndGg9MzMwMCANCg0KIyMgU2NvcmVzIHNpeHRoIGdyb3VwOiB0cmFuc2l0DQpGZmlyc3QgPSAwLjYgDQpGc2Vjb25kID0gMCANCkZ0aGlyZCA9IDANCg0KYGBgDQoNCmBgYHtzcWwgY29sbGVnZXMsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgY29sbGVnZXNfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICBjb2xsZWdlc19oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgY29sbGVnZXNfc2NvcmUgPSAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb2xsZWdlc19oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29sbGVnZXNfaGlnaF9zdHJlc3MgPSAwIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29sbGVnZXNfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb2xsZWdlc19oaWdoX3N0cmVzcyA9IGNvbGxlZ2VzX2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QWZpcnN0ID0gMCBUSEVOIGNvbGxlZ2VzX2xvd19zdHJlc3M6OkZMT0FUIC8gY29sbGVnZXNfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Bc2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgID9BZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9BZmlyc3QpICogKGNvbGxlZ2VzX2xvd19zdHJlc3M6OkZMT0FUIC0gMSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoY29sbGVnZXNfaGlnaF9zdHJlc3MgLSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0F0aGlyZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb2xsZWdlc19sb3dfc3RyZXNzID0gMSBUSEVOID9BZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbGxlZ2VzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0FmaXJzdCArID9Bc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QWZpcnN0ICsgP0FzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0FmaXJzdCAtID9Bc2Vjb25kKSAqIChjb2xsZWdlc19sb3dfc3RyZXNzOjpGTE9BVCAtIDIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoY29sbGVnZXNfaGlnaF9zdHJlc3MgLSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbGxlZ2VzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29sbGVnZXNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbGxlZ2VzX2xvd19zdHJlc3MgPSAzIFRIRU4gP0FmaXJzdCArID9Bc2Vjb25kICsgP0F0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0FmaXJzdCArID9Bc2Vjb25kICsgP0F0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QWZpcnN0IC0gP0FzZWNvbmQgLSA/QXRoaXJkKSAqIChjb2xsZWdlc19sb3dfc3RyZXNzOjpGTE9BVCAtIDMpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoY29sbGVnZXNfaGlnaF9zdHJlc3MgLSAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCBjb2xsZWdlIGluIHRoZSBuZWlnaGJvcmhvb2QNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzDQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMuY2VsbF9pZCkNCiAgICAgICAgICAgIEFORCAgICAgY2JzLmxvd19zdHJlc3MNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IGFzIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfY29sbGVnZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcw0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KDQpgYGB7c3FsIGNvbWNlbiwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gc2V0IGJsb2NrLWJhc2VkIHJhdyBudW1iZXJzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQubG93X3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IGJsb2NrLWJhc2VkIHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBjb21tdW5pdHlfY2VudGVyc19zY29yZSA9ICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2xvd19zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcyA9IGNvbW11bml0eV9jZW50ZXJzX2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9CZmlyc3QgPSAwIFRIRU4gY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzczo6RkxPQVQgLyBjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QnNlY29uZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCkgKiAoY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzIC0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0J0aGlyZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9CZmlyc3QgLSA/QnNlY29uZCkgKiAoY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzczo6RkxPQVQgLSAyKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MgLSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzID0gMiBUSEVOID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb21tdW5pdHlfY2VudGVyc19sb3dfc3RyZXNzID0gMyBUSEVOID9CZmlyc3QgKyA/QnNlY29uZCArID9CdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0JmaXJzdCArID9Cc2Vjb25kICsgP0J0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9CZmlyc3QgLSA/QnNlY29uZCAtID9CdGhpcmQpICogKGNvbW11bml0eV9jZW50ZXJzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzIC0gMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KDQotLSBzZXQgcG9wdWxhdGlvbiBzaGVkIGZvciBlYWNoIGNvbW11bml0eSBjZW50ZXIgaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMNClNFVCAgICAgcG9wX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMuY2VsbF9pZCkNCiAgICAgICAgKSwNCiAgICAgICAgcG9wX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycy5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzDQpTRVQgICAgIHBvcF9zY29yZSA9IENBU0UgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsNCmBgYA0KDQpgYGB7c3FsIGRlbnRpc3QsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgZGVudGlzdHNfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICBkZW50aXN0c19oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgZGVudGlzdHNfc2NvcmUgPSAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkZW50aXN0c19oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZGVudGlzdHNfaGlnaF9zdHJlc3MgPSAwIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZGVudGlzdHNfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkZW50aXN0c19oaWdoX3N0cmVzcyA9IGRlbnRpc3RzX2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QmZpcnN0ID0gMCBUSEVOIGRlbnRpc3RzX2xvd19zdHJlc3M6OkZMT0FUIC8gZGVudGlzdHNfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Cc2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9CZmlyc3QpICogKGRlbnRpc3RzX2xvd19zdHJlc3M6OkZMT0FUIC0gMSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoZGVudGlzdHNfaGlnaF9zdHJlc3MgLSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0J0aGlyZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkZW50aXN0c19sb3dfc3RyZXNzID0gMSBUSEVOID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRlbnRpc3RzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCAtID9Cc2Vjb25kKSAqIChkZW50aXN0c19sb3dfc3RyZXNzOjpGTE9BVCAtIDIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoZGVudGlzdHNfaGlnaF9zdHJlc3MgLSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRlbnRpc3RzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZGVudGlzdHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRlbnRpc3RzX2xvd19zdHJlc3MgPSAzIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kICsgP0J0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0JmaXJzdCArID9Cc2Vjb25kICsgP0J0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0IC0gP0JzZWNvbmQgLSA/QnRoaXJkKSAqIChkZW50aXN0c19sb3dfc3RyZXNzOjpGTE9BVCAtIDMpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoZGVudGlzdHNfaGlnaF9zdHJlc3MgLSAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCBkZW50aXN0cyBkZXN0aW5hdGlvbiBpbiB0aGUgbmVpZ2hib3Job29kDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cw0KU0VUICAgICBwb3BfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cy5jZWxsX2lkKQ0KICAgICAgICApLA0KICAgICAgICBwb3BfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmNlbGxfaWQpDQogICAgICAgICAgICBBTkQgICAgIGNicy5sb3dfc3RyZXNzDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMNClNFVCAgICAgcG9wX3Njb3JlID0gQ0FTRSAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtzcWwgZG9jdG9ycywgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiAsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgZG9jdG9yc19sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX2RvY3RvcnMNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICBkb2N0b3JzX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX2RvY3RvcnMNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgZG9jdG9yc19zY29yZSA9IENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZG9jdG9yc19oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkb2N0b3JzX2hpZ2hfc3RyZXNzID0gMCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZG9jdG9yc19sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZG9jdG9yc19oaWdoX3N0cmVzcyA9IGRvY3RvcnNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0JmaXJzdCA9IDAgVEhFTiBkb2N0b3JzX2xvd19zdHJlc3M6OkZMT0FUIC8gZG9jdG9yc19oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QnNlY29uZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCkgKiAoZG9jdG9yc19sb3dfc3RyZXNzOjpGTE9BVCAtIDEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoZG9jdG9yc19oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9CdGhpcmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRvY3RvcnNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRvY3RvcnNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0JmaXJzdCArID9Cc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCAtID9Cc2Vjb25kKSAqIChkb2N0b3JzX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKGRvY3RvcnNfaGlnaF9zdHJlc3MgLSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRvY3RvcnNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRvY3RvcnNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gZG9jdG9yc19sb3dfc3RyZXNzID0gMyBUSEVOID9CZmlyc3QgKyA/QnNlY29uZCArID9CdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0JmaXJzdCArID9Cc2Vjb25kICsgP0J0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9CZmlyc3QgLSA/QnNlY29uZCAtID9CdGhpcmQpICogKGRvY3RvcnNfbG93X3N0cmVzczo6RkxPQVQgLSAzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoZG9jdG9yc19oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCBkb2N0b3JzIGRlc3RpbmF0aW9uIGluIHRoZSBuZWlnaGJvcmhvb2QNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2RvY3RvcnMNClNFVCAgICAgcG9wX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycy5jZWxsX2lkKQ0KICAgICAgICApLA0KICAgICAgICBwb3BfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX2RvY3RvcnMuY2VsbF9pZCkNCiAgICAgICAgICAgIEFORCAgICAgY2JzLmxvd19zdHJlc3MNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IGFzIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2RvY3RvcnMNClNFVCAgICAgcG9wX3Njb3JlID0gQ0FTRSAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtzcWwgaG9zcGl0YWxzLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQotLSBzZXQgYmxvY2stYmFzZWQgcmF3IG51bWJlcnMNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIGhvc3BpdGFsc19sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5sb3dfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKSwNCiAgICAgICAgaG9zcGl0YWxzX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzZXQgYmxvY2stYmFzZWQgc2NvcmUNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIGhvc3BpdGFsc19zY29yZSA9ICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaG9zcGl0YWxzX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfaGlnaF9zdHJlc3MgPSAwIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaG9zcGl0YWxzX2xvd19zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaG9zcGl0YWxzX2hpZ2hfc3RyZXNzID0gaG9zcGl0YWxzX2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QWZpcnN0ID0gMCBUSEVOIGhvc3BpdGFsc19sb3dfc3RyZXNzOjpGTE9BVCAvIGhvc3BpdGFsc19oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0FzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0FmaXJzdCkgKiAoaG9zcGl0YWxzX2xvd19zdHJlc3M6OkZMT0FUIC0gMSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoaG9zcGl0YWxzX2hpZ2hfc3RyZXNzIC0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9BdGhpcmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaG9zcGl0YWxzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaG9zcGl0YWxzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0FmaXJzdCArID9Bc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QWZpcnN0ICsgP0FzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0FmaXJzdCAtID9Bc2Vjb25kKSAqIChob3NwaXRhbHNfbG93X3N0cmVzczo6RkxPQVQgLSAyKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKGhvc3BpdGFsc19oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaG9zcGl0YWxzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gaG9zcGl0YWxzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0FmaXJzdCArID9Bc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBob3NwaXRhbHNfbG93X3N0cmVzcyA9IDMgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQgKyA/QXRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QWZpcnN0ICsgP0FzZWNvbmQgKyA/QXRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9BZmlyc3QgLSA/QXNlY29uZCAtID9BdGhpcmQpICogKGhvc3BpdGFsc19sb3dfc3RyZXNzOjpGTE9BVCAtIDMpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoaG9zcGl0YWxzX2hpZ2hfc3RyZXNzIC0gMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQoNCi0tIHNldCBwb3B1bGF0aW9uIHNoZWQgZm9yIGVhY2ggaG9zcGl0YWxzIGRlc3RpbmF0aW9uIGluIHRoZSBuZWlnaGJvcmhvb2QNClVQREFURSAgZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscw0KU0VUICAgICBwb3BfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMuY2VsbF9pZCkNCiAgICAgICAgKSwNCiAgICAgICAgcG9wX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMuY2VsbF9pZCkNCiAgICAgICAgICAgIEFORCAgICAgY2JzLmxvd19zdHJlc3MNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IGFzIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfaG9zcGl0YWxzDQpTRVQgICAgIHBvcF9zY29yZSA9IENBU0UgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsNCmBgYA0KDQpgYGB7c3FsIHBhcmtzLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQotLSBzZXQgYmxvY2stYmFzZWQgcmF3IG51bWJlcnMNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHBhcmtzX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGFya3MNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfcGFya3MuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5sb3dfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKSwNCiAgICAgICAgcGFya3NfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGFya3MNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfcGFya3MuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzZXQgYmxvY2stYmFzZWQgc2NvcmUNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHBhcmtzX3Njb3JlID0gICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBhcmtzX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBhcmtzX2hpZ2hfc3RyZXNzID0gMCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBhcmtzX2hpZ2hfc3RyZXNzID0gcGFya3NfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0NmaXJzdCA9IDAgVEhFTiBwYXJrc19sb3dfc3RyZXNzOjpGTE9BVCAvIHBhcmtzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Dc2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0NmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/Q2ZpcnN0KSAqIChwYXJrc19sb3dfc3RyZXNzOjpGTE9BVCAtIDEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAocGFya3NfaGlnaF9zdHJlc3MgLSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/Q3RoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwYXJrc19sb3dfc3RyZXNzID0gMSBUSEVOID9DZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfbG93X3N0cmVzcyA9IDIgVEhFTiA/Q2ZpcnN0ICsgP0NzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0NmaXJzdCArID9Dc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0NmaXJzdCAtID9Dc2Vjb25kKSAqIChwYXJrc19sb3dfc3RyZXNzOjpGTE9BVCAtIDIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChwYXJrc19oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGFya3NfbG93X3N0cmVzcyA9IDEgVEhFTiA/Q2ZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBhcmtzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0NmaXJzdCArID9Dc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBhcmtzX2xvd19zdHJlc3MgPSAzIFRIRU4gP0NmaXJzdCArID9Dc2Vjb25kICsgP0N0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/Q2ZpcnN0ICsgP0NzZWNvbmQgKyA/Q3RoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0NmaXJzdCAtID9Dc2Vjb25kIC0gP0N0aGlyZCkgKiAocGFya3NfbG93X3N0cmVzczo6RkxPQVQgLSAzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAocGFya3NfaGlnaF9zdHJlc3MgLSAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQoNCi0tIHNldCBwb3B1bGF0aW9uIHNoZWQgZm9yIGVhY2ggcGFyayBpbiB0aGUgbmVpZ2hib3Job29kDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KU0VUICAgICBwb3BfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9wYXJrcy5jZWxsX2lkKQ0KICAgICAgICApLA0KICAgICAgICBwb3BfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3BhcmtzLmNlbGxfaWQpDQogICAgICAgICAgICBBTkQgICAgIGNicy5sb3dfc3RyZXNzDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBhcyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BhcmtzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcGFya3MNClNFVCAgICAgcG9wX3Njb3JlID0gQ0FTRSAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtzcWwgcGhhcm1hY2llcywgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KLS0gc2V0IGJsb2NrLWJhc2VkIHJhdyBudW1iZXJzDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBwaGFybWFjaWVzX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQubG93X3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICksDQogICAgICAgIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzLmNlbGxfaWQpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2V0IGJsb2NrLWJhc2VkIHNjb3JlDQpVUERBVEUgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KU0VUICAgICBwaGFybWFjaWVzX3Njb3JlID0gIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MgPSAwIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGhhcm1hY2llc19sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MgPSBwaGFybWFjaWVzX2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QmZpcnN0ID0gMCBUSEVOIHBoYXJtYWNpZXNfbG93X3N0cmVzczo6RkxPQVQgLyBwaGFybWFjaWVzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QnNlY29uZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0KSAqIChwaGFybWFjaWVzX2xvd19zdHJlc3M6OkZMT0FUIC0gMSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAocGhhcm1hY2llc19oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QnRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBoYXJtYWNpZXNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QmZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwaGFybWFjaWVzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCAtID9Cc2Vjb25kKSAqIChwaGFybWFjaWVzX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChwaGFybWFjaWVzX2hpZ2hfc3RyZXNzIC0gMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwaGFybWFjaWVzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGhhcm1hY2llc19sb3dfc3RyZXNzID0gMiBUSEVOID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGhhcm1hY2llc19sb3dfc3RyZXNzID0gMyBUSEVOID9CZmlyc3QgKyA/QnNlY29uZCArID9CdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9CZmlyc3QgKyA/QnNlY29uZCArID9CdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCAtID9Cc2Vjb25kIC0gP0J0aGlyZCkgKiAocGhhcm1hY2llc19sb3dfc3RyZXNzOjpGTE9BVCAtIDMpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAocGhhcm1hY2llc19oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KDQotLSBzZXQgcG9wdWxhdGlvbiBzaGVkIGZvciBlYWNoIHBoYXJtYWNpZXMgZGVzdGluYXRpb24gaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcw0KU0VUICAgICBwb3BfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzLmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcy5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcw0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCByZXRhaWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgcmV0YWlsX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3JldGFpbC5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICByZXRhaWxfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3JldGFpbC5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgcmV0YWlsX3Njb3JlID0gIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcmV0YWlsX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHJldGFpbF9oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHJldGFpbF9sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcmV0YWlsX2hpZ2hfc3RyZXNzID0gcmV0YWlsX2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9CZmlyc3QgPSAwIFRIRU4gcmV0YWlsX2xvd19zdHJlc3M6OkZMT0FUIC8gcmV0YWlsX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Cc2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QmZpcnN0KSAqIChyZXRhaWxfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHJldGFpbF9oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9CdGhpcmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHJldGFpbF9sb3dfc3RyZXNzID0gMSBUSEVOID9CZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcmV0YWlsX2xvd19zdHJlc3MgPSAyIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9CZmlyc3QgKyA/QnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9CZmlyc3QgLSA/QnNlY29uZCkgKiAocmV0YWlsX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHJldGFpbF9oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcmV0YWlsX2xvd19zdHJlc3MgPSAxIFRIRU4gP0JmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiByZXRhaWxfbG93X3N0cmVzcyA9IDIgVEhFTiA/QmZpcnN0ICsgP0JzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcmV0YWlsX2xvd19zdHJlc3MgPSAzIFRIRU4gP0JmaXJzdCArID9Cc2Vjb25kICsgP0J0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QmZpcnN0ICsgP0JzZWNvbmQgKyA/QnRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0JmaXJzdCAtID9Cc2Vjb25kIC0gP0J0aGlyZCkgKiAocmV0YWlsX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHJldGFpbF9oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCByZXRhaWwgZGVzdGluYXRpb24gaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3JldGFpbC5jZWxsX2lkKQ0KICAgICAgICApLA0KICAgICAgICBwb3BfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3JldGFpbC5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwuZ2VvbV9wb2x5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3JldGFpbA0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCBzY2hvb2xzLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQotLSBzZXQgYmxvY2stYmFzZWQgcmF3IG51bWJlcnMNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHNjaG9vbHNfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3NjaG9vbHMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5sb3dfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKSwNCiAgICAgICAgc2Nob29sc19oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgQ09VTlQoaWQpDQogICAgICAgICAgICBGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3NjaG9vbHMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzZXQgYmxvY2stYmFzZWQgc2NvcmUNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHNjaG9vbHNfc2NvcmUgPSBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNjaG9vbHNfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc2Nob29sc19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNjaG9vbHNfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNjaG9vbHNfaGlnaF9zdHJlc3MgPSBzY2hvb2xzX2xvd19zdHJlc3MgVEhFTiA/bWF4X3Njb3JlDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9DZmlyc3QgPSAwIFRIRU4gc2Nob29sc19sb3dfc3RyZXNzOjpGTE9BVCAvIHNjaG9vbHNfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0NzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/Q2ZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9DZmlyc3QpICogKHNjaG9vbHNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHNjaG9vbHNfaGlnaF9zdHJlc3MgLSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/Q3RoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzY2hvb2xzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0NmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzY2hvb2xzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0NmaXJzdCArID9Dc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9DZmlyc3QgKyA/Q3NlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9DZmlyc3QgLSA/Q3NlY29uZCkgKiAoc2Nob29sc19sb3dfc3RyZXNzOjpGTE9BVCAtIDIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChzY2hvb2xzX2hpZ2hfc3RyZXNzIC0gMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzY2hvb2xzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0NmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzY2hvb2xzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0NmaXJzdCArID9Dc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNjaG9vbHNfbG93X3N0cmVzcyA9IDMgVEhFTiA/Q2ZpcnN0ICsgP0NzZWNvbmQgKyA/Q3RoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9DZmlyc3QgKyA/Q3NlY29uZCArID9DdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/Q2ZpcnN0IC0gP0NzZWNvbmQgLSA/Q3RoaXJkKSAqIChzY2hvb2xzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHNjaG9vbHNfaGlnaF9zdHJlc3MgLSAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQoNCi0tIHNldCBwb3B1bGF0aW9uIHNoZWQgZm9yIGVhY2ggc2Nob29sIGluIHRoZSBuZWlnaGJvcmhvb2QNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMNClNFVCAgICAgcG9wX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5jZWxsX2lkKQ0KICAgICAgICApLA0KICAgICAgICBwb3BfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3NjaG9vbHMuY2VsbF9pZCkNCiAgICAgICAgICAgIEFORCAgICAgY2JzLmxvd19zdHJlc3MNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IGFzIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMNClNFVCAgICAgcG9wX3Njb3JlID0gQ0FTRSAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtzcWwgc29jc2VydiwgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24sIG91dHB1dC52YXIgPSAib3V0cHV0IiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQotLSBzZXQgYmxvY2stYmFzZWQgcmF3IG51bWJlcnMNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHNvY2lhbF9zZXJ2aWNlc19sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5sb3dfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKSwNCiAgICAgICAgc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzZXQgYmxvY2stYmFzZWQgc2NvcmUNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHNvY2lhbF9zZXJ2aWNlc19zY29yZSA9IENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgPSAwIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNvY2lhbF9zZXJ2aWNlc19sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgPSBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QWZpcnN0ID0gMCBUSEVOIHNvY2lhbF9zZXJ2aWNlc19sb3dfc3RyZXNzOjpGTE9BVCAvIHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Bc2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/QWZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0FmaXJzdCkgKiAoc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3M6OkZMT0FUIC0gMSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0F0aGlyZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHNvY2lhbF9zZXJ2aWNlc19sb3dfc3RyZXNzID0gMSBUSEVOID9BZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/QWZpcnN0ICsgP0FzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9BZmlyc3QgLSA/QXNlY29uZCkgKiAoc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzIC0gMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzb2NpYWxfc2VydmljZXNfbG93X3N0cmVzcyA9IDEgVEhFTiA/QWZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0FmaXJzdCArID9Bc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3MgPSAzIFRIRU4gP0FmaXJzdCArID9Bc2Vjb25kICsgP0F0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9BZmlyc3QgKyA/QXNlY29uZCArID9BdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9BZmlyc3QgLSA/QXNlY29uZCAtID9BdGhpcmQpICogKHNvY2lhbF9zZXJ2aWNlc19sb3dfc3RyZXNzOjpGTE9BVCAtIDMpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQoNCi0tIHNldCBwb3B1bGF0aW9uIHNoZWQgZm9yIGVhY2ggc29jaWFsIHNlcnZpY2UgZGVzdGluYXRpb24gaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzDQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcy5jZWxsX2lkKQ0KICAgICAgICApLA0KICAgICAgICBwb3BfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcy5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMNClNFVCAgICAgcG9wX3Njb3JlID0gQ0FTRSAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtzcWwgc3VwZXJtYXJrZXRzLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQotLSBzZXQgYmxvY2stYmFzZWQgcmF3IG51bWJlcnMNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHN1cGVybWFya2V0c19sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5sb3dfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKSwNCiAgICAgICAgc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cw0KICAgICAgICAgICAgV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC5zb3VyY2VfY2VsbGlkID0gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmNlbGxfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZC50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMuY2VsbF9pZCkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzZXQgYmxvY2stYmFzZWQgc2NvcmUNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHN1cGVybWFya2V0c19zY29yZSA9ICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MgPSAwIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHN1cGVybWFya2V0c19sb3dfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MgPSBzdXBlcm1hcmtldHNfbG93X3N0cmVzcyBUSEVOID9tYXhfc2NvcmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/RGZpcnN0ID0gMCBUSEVOIHN1cGVybWFya2V0c19sb3dfc3RyZXNzOjpGTE9BVCAvIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Ec2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICA/RGZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0RmaXJzdCkgKiAoc3VwZXJtYXJrZXRzX2xvd19zdHJlc3M6OkZMT0FUIC0gMSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyAtIDEpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0R0aGlyZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHN1cGVybWFya2V0c19sb3dfc3RyZXNzID0gMSBUSEVOID9EZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzdXBlcm1hcmtldHNfbG93X3N0cmVzcyA9IDIgVEhFTiA/RGZpcnN0ICsgP0RzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/RGZpcnN0ICsgP0RzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9EZmlyc3QgLSA/RHNlY29uZCkgKiAoc3VwZXJtYXJrZXRzX2xvd19zdHJlc3M6OkZMT0FUIC0gMikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzIC0gMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzdXBlcm1hcmtldHNfbG93X3N0cmVzcyA9IDEgVEhFTiA/RGZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc3VwZXJtYXJrZXRzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0RmaXJzdCArID9Ec2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc3VwZXJtYXJrZXRzX2xvd19zdHJlc3MgPSAzIFRIRU4gP0RmaXJzdCArID9Ec2Vjb25kICsgP0R0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9EZmlyc3QgKyA/RHNlY29uZCArID9EdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9EZmlyc3QgLSA/RHNlY29uZCAtID9EdGhpcmQpICogKHN1cGVybWFya2V0c19sb3dfc3RyZXNzOjpGTE9BVCAtIDMpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyAtIDMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQoNCi0tIHNldCBwb3B1bGF0aW9uIHNoZWQgZm9yIGVhY2ggc3VwZXJtYXJrZXQgaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzDQpTRVQgICAgIHBvcF9oaWdoX3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cy5jZWxsX2lkKQ0KICAgICAgICApLA0KICAgICAgICBwb3BfbG93X3N0cmVzcyA9ICgNCiAgICAgICAgICAgIFNFTEVDVCAgU1VNKGNiLnBhcnRpYWxfcCkNCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIGNiLA0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkIGNicw0KICAgICAgICAgICAgV0hFUkUgICBjYnMuc291cmNlX2NlbGxpZCA9IGNiLmNlbGxfaWQNCiAgICAgICAgICAgIEFORCAgICAgY2JzLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cy5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQpVUERBVEUgIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMNClNFVCAgICAgcG9wX3Njb3JlID0gQ0FTRSAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVCAvIHBvcF9oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkOw0KYGBgDQoNCmBgYHtzcWwgdHJhaWxzLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgb3V0cHV0LnZhciA9ICJvdXRwdXQiLCBpbmNsdWRlID0gRkFMU0V9DQotLSBsb3cgc3RyZXNzIGFjY2Vzcw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgdHJhaWxzX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKHBhdGhfaWQpDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wYXRocw0KICAgICAgICAgICAgV0hFUkUgICBwYXRoX2xlbmd0aCA+ID9taW5fcGF0aF9sZW5ndGgNCiAgICAgICAgICAgIEFORCAgICAgYmJveF9sZW5ndGggPiA/bWluX2Jib3hfbGVuZ3RoDQogICAgICAgICAgICBBTkQgICAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3JlYWNoYWJsZV9yb2Fkc19sb3dfc3RyZXNzIGxzDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGxzLnRhcmdldF9yb2FkID0gQU5ZKGdlbmVyYXRlZC5zYV9wYXRocy5yb2FkX2lkcykNCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCAgICAgbHMuYmFzZV9yb2FkID0gQU5ZKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5yb2FkX2lkcykNCiAgICAgICAgICAgICkNCiAgICAgICAgKSwNCiAgICAgICAgdHJhaWxzX2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChwYXRoX2lkKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcGF0aHMNCiAgICAgICAgICAgIFdIRVJFICAgcGF0aF9sZW5ndGggPiA/bWluX3BhdGhfbGVuZ3RoDQogICAgICAgICAgICBBTkQgICAgIGJib3hfbGVuZ3RoID4gP21pbl9iYm94X2xlbmd0aA0KICAgICAgICAgICAgQU5EICAgICBFWElTVFMgKA0KICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICAgICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9yZWFjaGFibGVfcm9hZHNfaGlnaF9zdHJlc3MgaHMNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICAgaHMudGFyZ2V0X3JvYWQgPSBBTlkoZ2VuZXJhdGVkLnNhX3BhdGhzLnJvYWRfaWRzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBocy5iYXNlX3JvYWQgPSBBTlkoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLnJvYWRfaWRzKQ0KICAgICAgICAgICAgKQ0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzZXQgYmxvY2stYmFzZWQgc2NvcmUNClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIHRyYWlsc19zY29yZSA9ICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYWlsc19oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFpbHNfaGlnaF9zdHJlc3MgPSAwIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFpbHNfbG93X3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYWlsc19oaWdoX3N0cmVzcyA9IHRyYWlsc19sb3dfc3RyZXNzIFRIRU4gP21heF9zY29yZQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/RWZpcnN0ID0gMCBUSEVOIHRyYWlsc19sb3dfc3RyZXNzOjpGTE9BVCAvIHRyYWlsc19oaWdoX3N0cmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/RXNlY29uZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgID9FZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0VmaXJzdCkgKiAodHJhaWxzX2xvd19zdHJlc3M6OkZMT0FUIC0gMSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICh0cmFpbHNfaGlnaF9zdHJlc3MgLSAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/RXRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFpbHNfbG93X3N0cmVzcyA9IDEgVEhFTiA/RWZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYWlsc19sb3dfc3RyZXNzID0gMiBUSEVOID9FZmlyc3QgKyA/RXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/RWZpcnN0ICsgP0VzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/RWZpcnN0IC0gP0VzZWNvbmQpICogKHRyYWlsc19sb3dfc3RyZXNzOjpGTE9BVCAtIDIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICh0cmFpbHNfaGlnaF9zdHJlc3MgLSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYWlsc19sb3dfc3RyZXNzID0gMSBUSEVOID9FZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhaWxzX2xvd19zdHJlc3MgPSAyIFRIRU4gP0VmaXJzdCArID9Fc2Vjb25kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYWlsc19sb3dfc3RyZXNzID0gMyBUSEVOID9FZmlyc3QgKyA/RXNlY29uZCArID9FdGhpcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0VmaXJzdCArID9Fc2Vjb25kICsgP0V0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoP21heF9zY29yZSAtID9FZmlyc3QgLSA/RXNlY29uZCAtID9FdGhpcmQpICogKHRyYWlsc19sb3dfc3RyZXNzOjpGTE9BVCAtIDMpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICh0cmFpbHNfaGlnaF9zdHJlc3MgLSAzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsNCmBgYA0KDQpgYGB7c3FsIHRyYW5zaXQsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgdHJhbnNpdF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3RyYW5zaXQNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdC5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICB0cmFuc2l0X2hpZ2hfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBDT1VOVChpZCkNCiAgICAgICAgICAgIEZST00gICAgZGVzdGluYXRpb25zLnNhX3RyYW5zaXQNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQuc291cmNlX2NlbGxpZCA9IGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5jZWxsX2lkDQogICAgICAgICAgICAgICAgICAgICAgICBBTkQgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdC5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgdHJhbnNpdF9zY29yZSA9ICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFuc2l0X2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYW5zaXRfaGlnaF9zdHJlc3MgPSAwIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFuc2l0X2xvd19zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFuc2l0X2hpZ2hfc3RyZXNzID0gdHJhbnNpdF9sb3dfc3RyZXNzIFRIRU4gP21heF9zY29yZQ0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/RmZpcnN0ID0gMCBUSEVOIHRyYW5zaXRfbG93X3N0cmVzczo6RkxPQVQgLyB0cmFuc2l0X2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9Gc2Vjb25kID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gICAgP0ZmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/RmZpcnN0KSAqICh0cmFuc2l0X2xvd19zdHJlc3M6OkZMT0FUIC0gMSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICh0cmFuc2l0X2hpZ2hfc3RyZXNzIC0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0Z0aGlyZCA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhbnNpdF9sb3dfc3RyZXNzID0gMSBUSEVOID9GZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhbnNpdF9sb3dfc3RyZXNzID0gMiBUSEVOID9GZmlyc3QgKyA/RnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/RmZpcnN0ICsgP0ZzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/RmZpcnN0IC0gP0ZzZWNvbmQpICogKHRyYW5zaXRfbG93X3N0cmVzczo6RkxPQVQgLSAyKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAodHJhbnNpdF9oaWdoX3N0cmVzcyAtIDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhbnNpdF9sb3dfc3RyZXNzID0gMSBUSEVOID9GZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdHJhbnNpdF9sb3dfc3RyZXNzID0gMiBUSEVOID9GZmlyc3QgKyA/RnNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB0cmFuc2l0X2xvd19zdHJlc3MgPSAzIFRIRU4gP0ZmaXJzdCArID9Gc2Vjb25kICsgP0Z0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSA/RmZpcnN0ICsgP0ZzZWNvbmQgKyA/RnRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0ZmaXJzdCAtID9Gc2Vjb25kIC0gP0Z0aGlyZCkgKiAodHJhbnNpdF9sb3dfc3RyZXNzOjpGTE9BVCAtIDMpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICh0cmFuc2l0X2hpZ2hfc3RyZXNzIC0gMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KDQotLSBzZXQgcG9wdWxhdGlvbiBzaGVkIGZvciBlYWNoIHBhcmsgaW4gdGhlIG5laWdoYm9yaG9vZA0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdA0KU0VUICAgICBwb3BfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0LmNlbGxfaWQpDQogICAgICAgICksDQogICAgICAgIHBvcF9sb3dfc3RyZXNzID0gKA0KICAgICAgICAgICAgU0VMRUNUICBTVU0oY2IucGFydGlhbF9wKQ0KICAgICAgICAgICAgRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgY2IsDQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC5zYV9jb25uZWN0ZWRfcG9wX2dyaWQgY2JzDQogICAgICAgICAgICBXSEVSRSAgIGNicy5zb3VyY2VfY2VsbGlkID0gY2IuY2VsbF9pZA0KICAgICAgICAgICAgQU5EICAgICBjYnMudGFyZ2V0X2NlbGxpZCA9IEFOWShkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdC5jZWxsX2lkKQ0KICAgICAgICAgICAgQU5EICAgICBjYnMubG93X3N0cmVzcw0KICAgICAgICApDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0Lmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdA0KU0VUICAgICBwb3Bfc2NvcmUgPSBDQVNFICAgIFdIRU4gcG9wX2hpZ2hfc3RyZXNzIElTIE5VTEwgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUIC8gcG9wX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EOw0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQ7DQpgYGANCg0KYGBge3NxbCB1bml2ZXJzaXRpZXMsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NCi0tIHNldCBibG9jay1iYXNlZCByYXcgbnVtYmVycw0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgdW5pdmVyc2l0aWVzX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLmxvd19zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICApLA0KICAgICAgICB1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIENPVU5UKGlkKQ0KICAgICAgICAgICAgRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzDQogICAgICAgICAgICBXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnNvdXJjZV9jZWxsaWQgPSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuY2VsbF9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgQU5EICAgICBnZW5lcmF0ZWQuc2FfY29ubmVjdGVkX3BvcF9ncmlkLnRhcmdldF9jZWxsaWQgPSBBTlkoZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcy5jZWxsX2lkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICkNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNldCBibG9jay1iYXNlZCBzY29yZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNClNFVCAgICAgdW5pdmVyc2l0aWVzX3Njb3JlID0gICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcyBJUyBOVUxMIFRIRU4gTlVMTA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcyA9IDAgVEhFTiBOVUxMDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdW5pdmVyc2l0aWVzX2xvd19zdHJlc3MgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcyA9IHVuaXZlcnNpdGllc19sb3dfc3RyZXNzIFRIRU4gP21heF9zY29yZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOID9BZmlyc3QgPSAwIFRIRU4gdW5pdmVyc2l0aWVzX2xvd19zdHJlc3M6OkZMT0FUIC8gdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gP0FzZWNvbmQgPSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOICAgID9BZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKD9tYXhfc2NvcmUgLSA/QWZpcnN0KSAqICh1bml2ZXJzaXRpZXNfbG93X3N0cmVzczo6RkxPQVQgLSAxKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAodW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzIC0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiA/QXRoaXJkID0gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gdW5pdmVyc2l0aWVzX2xvd19zdHJlc3MgPSAxIFRIRU4gP0FmaXJzdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHVuaXZlcnNpdGllc19sb3dfc3RyZXNzID0gMiBUSEVOID9BZmlyc3QgKyA/QXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFID9BZmlyc3QgKyA/QXNlY29uZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0FmaXJzdCAtID9Bc2Vjb25kKSAqICh1bml2ZXJzaXRpZXNfbG93X3N0cmVzczo6RkxPQVQgLSAyKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICh1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3MgLSAyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHVuaXZlcnNpdGllc19sb3dfc3RyZXNzID0gMSBUSEVOID9BZmlyc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB1bml2ZXJzaXRpZXNfbG93X3N0cmVzcyA9IDIgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB1bml2ZXJzaXRpZXNfbG93X3N0cmVzcyA9IDMgVEhFTiA/QWZpcnN0ICsgP0FzZWNvbmQgKyA/QXRoaXJkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgP0FmaXJzdCArID9Bc2Vjb25kICsgP0F0aGlyZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCg/bWF4X3Njb3JlIC0gP0FmaXJzdCAtID9Bc2Vjb25kIC0gP0F0aGlyZCkgKiAodW5pdmVyc2l0aWVzX2xvd19zdHJlc3M6OkZMT0FUIC0gMykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAodW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzIC0gMykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORDsNCg0KLS0gc2V0IHBvcHVsYXRpb24gc2hlZCBmb3IgZWFjaCB1bml2ZXJzaXR5IGluIHRoZSBuZWlnaGJvcmhvb2QNClVQREFURSAgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcw0KU0VUICAgICBwb3BfaGlnaF9zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuY2VsbF9pZCkNCiAgICAgICAgKSwNCiAgICAgICAgcG9wX2xvd19zdHJlc3MgPSAoDQogICAgICAgICAgICBTRUxFQ1QgIFNVTShjYi5wYXJ0aWFsX3ApDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBjYiwNCiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLnNhX2Nvbm5lY3RlZF9wb3BfZ3JpZCBjYnMNCiAgICAgICAgICAgIFdIRVJFICAgY2JzLnNvdXJjZV9jZWxsaWQgPSBjYi5jZWxsX2lkDQogICAgICAgICAgICBBTkQgICAgIGNicy50YXJnZXRfY2VsbGlkID0gQU5ZKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuY2VsbF9pZCkNCiAgICAgICAgICAgIEFORCAgICAgY2JzLmxvd19zdHJlc3MNCiAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IGFzIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KVVBEQVRFICBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzDQpTRVQgICAgIHBvcF9zY29yZSA9IENBU0UgICAgV0hFTiBwb3BfaGlnaF9zdHJlc3MgSVMgTlVMTCBUSEVOIE5VTEwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBvcF9oaWdoX3N0cmVzcyA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQgLyBwb3BfaGlnaF9zdHJlc3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQ7DQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsgICAgICAgICAgICAgICAgICAgICAgICANCmBgYA0KDQpPbmNlIGFnYWluLCBvbiB0aGlzIHN0ZXAgSSBkbyBub3QgaW5jbHVkZSB0aGUgU1FMIGNvZGVzLCBob3dldmVyIHRoZXkgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGBSbWRgIGZpbGUuDQoNCiMjIyAxMS4gQ29tcHV0ZSBvdmVyYWxsIGFjY2Vzcw0KDQpEdXJpbmcgdGhpcyBzdGVwIHRoZSBvdmVyYWxsIGFjY2VzcyBpcyBjb21wdXRlZCBmb3IgZWFjaCBwb3B1bGF0aW9uIGdyaWQsIG1lYW5pbmcgdGhhdCB3ZSBjYW4gYWxyZWFkeSBvYnNlcnZlIHRoZSBCTkEgc2NvcmUgc3BhdGlhbCBiZWhhdmlvciB3aXRoaW4gb3VyIHN0dWR5IGFyZWEuIA0KDQpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQ0KdG90YWwgPSAxMDANCnBlb3BsZSA9IDE1DQpvcHBvcnR1bml0eSA9IDIwDQpjb3JlX3NlcnZpY2VzID0gMjANCnJldGFpbCA9IDE1DQpyZWNyZWF0aW9uID0gMTUNCnRyYW5zaXQgPSAxNQ0KYGBgDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBvdXRwdXQudmFyID0gIm91dHB1dCIsIGluY2x1ZGUgPSBGQUxTRX0NClVQREFURSAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpTRVQgICAgIG92ZXJhbGxfc2NvcmUgPSA/dG90YWwgKg0KICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgID9wZW9wbGUgKiBDT0FMRVNDRShwb3Bfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICArID9vcHBvcnR1bml0eSAqDQogICAgICAgICAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgV0hFTiAgICBDT0FMRVNDRShzY2hvb2xzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShjb2xsZWdlc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0UodW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICBFTFNFICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNSAqIENPQUxFU0NFKGVtcF9zY29yZSwwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjM1ICogQ09BTEVTQ0Uoc2Nob29sc19zY29yZSwwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjEgKiBDT0FMRVNDRShjb2xsZWdlc19zY29yZSwwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjIgKiBDT0FMRVNDRSh1bml2ZXJzaXRpZXNfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBzY2hvb2xzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMzUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBjb2xsZWdlc19oaWdoX3N0cmVzcyA+IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiB1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4yDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICsgP2NvcmVfc2VydmljZXMgKg0KICAgICAgICAgICAgICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gICAgQ09BTEVTQ0UoZG9jdG9yc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0UoZGVudGlzdHNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKGhvc3BpdGFsc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0UocGhhcm1hY2llc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0Uoc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgIEVMU0UgICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIgKiBDT0FMRVNDRShkb2N0b3JzX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDAuMSAqIENPQUxFU0NFKGRlbnRpc3RzX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDAuMiAqIENPQUxFU0NFKGhvc3BpdGFsc19zY29yZSwwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjEgKiBDT0FMRVNDRShwaGFybWFjaWVzX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDAuMjUgKiBDT0FMRVNDRShzdXBlcm1hcmtldHNfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMC4xNSAqIENPQUxFU0NFKHNvY2lhbF9zZXJ2aWNlc19zY29yZSwwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBkb2N0b3JzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4yDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGRlbnRpc3RzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIGhvc3BpdGFsc19oaWdoX3N0cmVzcyA+IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBwaGFybWFjaWVzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyA+IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjI1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMTUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgKyA/cmV0YWlsICogQ09BTEVTQ0UocmV0YWlsX3Njb3JlLDApDQogICAgICAgICAgICAgICAgKyA/cmVjcmVhdGlvbiAqDQogICAgICAgICAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgV0hFTiAgICBDT0FMRVNDRShwYXJrc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0UodHJhaWxzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgRUxTRSAgICAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNCAqIENPQUxFU0NFKHBhcmtzX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDAuMzUgKiBDT0FMRVNDRSh0cmFpbHNfc2NvcmUsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMC4yNSAqIENPQUxFU0NFKGNvbW11bml0eV9jZW50ZXJzX3Njb3JlLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBhcmtzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC40DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIHRyYWlsc19oaWdoX3N0cmVzcyA+IDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjM1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4yNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICArID90cmFuc2l0ICogQ09BTEVTQ0UodHJhbnNpdF9zY29yZSwwKQ0KICAgICAgICAgICAgKSAvDQogICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgP3Blb3BsZQ0KICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0Uoc2Nob29sc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0UoY29sbGVnZXNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgRUxTRSA/b3Bwb3J0dW5pdHkNCiAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgV0hFTiBDT0FMRVNDRShkb2N0b3JzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShkZW50aXN0c19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ09BTEVTQ0UoaG9zcGl0YWxzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShwaGFybWFjaWVzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRShzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcywwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICAgICAgRUxTRSA/Y29yZV9zZXJ2aWNlcw0KICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHJldGFpbF9oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgICAgIEVMU0UgP3JldGFpbA0KICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICBXSEVOIENPQUxFU0NFKHBhcmtzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDT0FMRVNDRSh0cmFpbHNfaGlnaF9zdHJlc3MsMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENPQUxFU0NFKGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzLDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICBFTFNFID9yZWNyZWF0aW9uDQogICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgIFdIRU4gQ09BTEVTQ0UodHJhbnNpdF9oaWdoX3N0cmVzcywwKSA9IDANCiAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMA0KICAgICAgICAgICAgICAgICAgICBFTFNFID90cmFuc2l0DQogICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgKQ0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhiLmdlb21ldHJ5LGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSkNCiAgICAgICAgKTsNCiAgICAgICAgDQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZDsNCmBgYA0KDQojIyMgMTIuIENvbXB1dGUgb3ZlcmFsbCBzY29yZSBmb3IgdGhlIHdob2xlIHN0dWR5IGFyZWENCg0KRm9yIHRoaXMgc3RlcCBhIG5ldyB0YWJsZSBpcyBnZW5lcmF0ZWQgaW4gdGhlIGRhdGFiYXNlIGBzYV9zY29yZV9pbnB1dHNgIHRvIHN0b3JlIHRoZSBwcmVsaW1pbmFyeSByZXN1bHRzLiBUaGUgY29kZSBjYW4gYmUgYWNjZXNzZWQgb24gdGhlIGBSbWRgIGZpbGUuIA0KDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gY29ubmVjdGlvbiwgaW5jbHVkZSA9IEZBTFNFfQ0KDQpEUk9QIFRBQkxFIElGIEVYSVNUUyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzOw0KDQpDUkVBVEUgVEFCTEUgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgaWQgU0VSSUFMIFBSSU1BUlkgS0VZLA0KICAgIGNhdGVnb3J5IFRFWFQsDQogICAgc2NvcmVfbmFtZSBURVhULA0KICAgIHNjb3JlIE5VTUVSSUMoMTYsNCksDQogICAgbm90ZXMgVEVYVCwNCiAgICBodW1hbl9leHBsYW5hdGlvbiBURVhULA0KICAgIHVzZV9wb3AgQk9PTEVBTiwNCiAgICB1c2VfZW1wIEJPT0xFQU4sDQogICAgdXNlX2sxMiBCT09MRUFOLA0KICAgIHVzZV90ZWNoIEJPT0xFQU4sDQogICAgdXNlX3VuaXYgQk9PTEVBTiwNCiAgICB1c2VfZG9jdG9yIEJPT0xFQU4sDQogICAgdXNlX2RlbnRpc3QgQk9PTEVBTiwNCiAgICB1c2VfaG9zcGl0YWwgQk9PTEVBTiwNCiAgICB1c2VfcGhhcm1hY3kgQk9PTEVBTiwNCiAgICB1c2VfcmV0YWlsIEJPT0xFQU4sDQogICAgdXNlX2dyb2NlcnkgQk9PTEVBTiwNCiAgICB1c2Vfc29jaWFsX3N2Y3MgQk9PTEVBTiwNCiAgICB1c2VfcGFya3MgQk9PTEVBTiwNCiAgICB1c2VfdHJhaWxzIEJPT0xFQU4sDQogICAgdXNlX2NvbW1fY3RycyBCT09MRUFOLA0KICAgIHVzZV90cmFuc2l0IEJPT0xFQU4NCik7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHRlbXBvcmFyeSB0YWJsZSBvZiB0b3RhbCBwb3B1bGF0aW9uDQotLSBmb3Igd2VpZ2h0aW5nIHB1cnBvc2VzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpEUk9QIFRBQkxFIElGIEVYSVNUUyB0bXBfcG9wOw0KQ1JFQVRFIFRFTVAgVEFCTEUgdG1wX3BvcCAoDQogICAgb3ZlcmFsbCBJTlRFR0VSLA0KICAgIGsxMiBJTlRFR0VSLA0KICAgIHRlY2ggSU5URUdFUiwNCiAgICB1bml2IElOVEVHRVIsDQogICAgZG9jdG9yIElOVEVHRVIsDQogICAgZGVudGlzdCBJTlRFR0VSLA0KICAgIGhvc3BpdGFsIElOVEVHRVIsDQogICAgcGhhcm1hY3kgSU5URUdFUiwNCiAgICByZXRhaWwgSU5URUdFUiwNCiAgICBncm9jZXJ5IElOVEVHRVIsDQogICAgc29jaWFsX3N2Y3MgSU5URUdFUiwNCiAgICBwYXJrcyBJTlRFR0VSLA0KICAgIHRyYWlscyBJTlRFR0VSLA0KICAgIGNvbW1fY3RycyBJTlRFR0VSLA0KICAgIHRyYW5zaXQgSU5URUdFUg0KKTsNCg0KSU5TRVJUIElOVE8gdG1wX3BvcCAoDQogICAgb3ZlcmFsbCwgazEyLCB0ZWNoLCB1bml2LCBkb2N0b3IsIGRlbnRpc3QsIGhvc3BpdGFsLCBwaGFybWFjeSwNCiAgICByZXRhaWwsIGdyb2NlcnksIHNvY2lhbF9zdmNzLCBwYXJrcywgdHJhaWxzLCBjb21tX2N0cnMsIHRyYW5zaXQNCikNClNFTEVDVCAgU1VNKHBhcnRpYWxfcCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0Uoc2Nob29sc19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UoY29sbGVnZXNfaGlnaF9zdHJlc3MsMCkgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCBFTkQpLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIENPQUxFU0NFKHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UoZG9jdG9yc19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UoZGVudGlzdHNfaGlnaF9zdHJlc3MsMCkgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCBFTkQpLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIENPQUxFU0NFKGhvc3BpdGFsc19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UocGhhcm1hY2llc19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UocmV0YWlsX2hpZ2hfc3RyZXNzLDApID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgRU5EKSwNCiAgICAgICAgU1VNKENBU0UgV0hFTiBDT0FMRVNDRShzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MsMCkgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCBFTkQpLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIENPQUxFU0NFKHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UocGFya3NfaGlnaF9zdHJlc3MsMCkgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCBFTkQpLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIENPQUxFU0NFKHRyYWlsc19oaWdoX3N0cmVzcywwKSA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wIEVORCksDQogICAgICAgIFNVTShDQVNFIFdIRU4gQ09BTEVTQ0UoY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MsMCkgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCBFTkQpLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIENPQUxFU0NFKHRyYW5zaXRfaGlnaF9zdHJlc3MsMCkgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCBFTkQpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNClNFTEVDVCAqIEZST00gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0czsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gcG9wdWxhdGlvbg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gbWVkaWFuIHBvcCBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdQZW9wbGUnLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIGFjY2VzcyB0byBwb3B1bGF0aW9uJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgdG8gcG9wdWxhdGlvbiBhY2Nlc3NpYmxlIG92ZXJhbGwsIGV4cHJlc3NlZCBhcw0KICAgICAgICAgICAgdGhlIG1lZGlhbiBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGEgcmF0aW8gb2YgbG93IHN0cmVzcyB0byBoaWdoIHN0cmVzcyBhY2Nlc3MgYWJvdmUgdGhpcyBudW1iZXIsDQogICAgICAgICAgICBoYWxmIGhhdmUgYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgcG9wIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1Blb3BsZScsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgYWNjZXNzIHRvIHBvcHVsYXRpb24nLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgdG8gcG9wdWxhdGlvbiBhY2Nlc3NpYmxlIG92ZXJhbGwsIGV4cHJlc3NlZCBhcw0KICAgICAgICAgICAgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgYSByYXRpbyBvZiBsb3cgc3RyZXNzIHRvIGhpZ2ggc3RyZXNzIGFjY2VzcyBhYm92ZSB0aGlzIG51bWJlciwNCiAgICAgICAgICAgIDcwJSBoYXZlIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIHBvcCBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdQZW9wbGUnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIGFjY2VzcyB0byBwb3B1bGF0aW9uJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgdG8gcG9wdWxhdGlvbiBhY2Nlc3NpYmxlIG92ZXJhbGwsIGV4cHJlc3NlZCBhcw0KICAgICAgICAgICAgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgYSByYXRpbyBvZiBsb3cgc3RyZXNzIHRvIGhpZ2ggc3RyZXNzIGFjY2VzcyBhYm92ZSB0aGlzIG51bWJlciwNCiAgICAgICAgICAgIDMwJSBoYXZlIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gYXZnIHBvcCBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdQZW9wbGUnLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gcG9wdWxhdGlvbicsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIHRvIHBvcHVsYXRpb24gYWNjZXNzaWJsZSBvdmVyYWxsLCBleHByZXNzZWQgYXMNCiAgICAgICAgICAgIHRoZSBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgdGhpcyByYXRpbyBvZiBsb3cgc3RyZXNzIHRvIGhpZ2ggc3RyZXNzIGFjY2Vzcy4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV9wb3ANCikNClNFTEVDVCAgJ1Blb3BsZScsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGFjY2VzcyB0byBwb3B1bGF0aW9uJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLm92ZXJhbGwgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCAqIHBvcF9zY29yZSAvIHRtcF9wb3Aub3ZlcmFsbCBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSBwb3B1bGF0aW9uIHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgcG9wdWxhdGlvbiBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGVtcGxveW1lbnQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIG1lZGlhbiBqb2JzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJ01lZGlhbiBzY29yZSBvZiBhY2Nlc3MgdG8gZW1wbG95bWVudCcsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gZW1wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgZW1wX2xvd19zdHJlc3M6OkZMT0FUL2VtcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgZW1wbG95bWVudCBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIHRvIGVtcGxveW1lbnQgYWNjZXNzaWJsZSBvdmVyYWxsLCBleHByZXNzZWQgYXMNCiAgICAgICAgICAgIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBhIHJhdGlvIG9mIGxvdyBzdHJlc3MgdG8gaGlnaCBzdHJlc3MgYWNjZXNzIGFib3ZlIHRoaXMgbnVtYmVyLA0KICAgICAgICAgICAgaGFsZiBoYXZlIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gNzB0aCBwZXJjZW50aWxlIGpvYnMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIGFjY2VzcyB0byBlbXBsb3ltZW50JywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBlbXBfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBlbXBfbG93X3N0cmVzczo6RkxPQVQvZW1wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBlbXBsb3ltZW50IGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgdG8gZW1wbG95bWVudCBhY2Nlc3NpYmxlIG92ZXJhbGwsIGV4cHJlc3NlZCBhcw0KICAgICAgICAgICAgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgYSByYXRpbyBvZiBsb3cgc3RyZXNzIHRvIGhpZ2ggc3RyZXNzIGFjY2VzcyBhYm92ZSB0aGlzIG51bWJlciwNCiAgICAgICAgICAgIDcwJSBoYXZlIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIGpvYnMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIGFjY2VzcyB0byBlbXBsb3ltZW50JywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBlbXBfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBlbXBfbG93X3N0cmVzczo6RkxPQVQvZW1wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBlbXBsb3ltZW50IGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgdG8gZW1wbG95bWVudCBhY2Nlc3NpYmxlIG92ZXJhbGwsIGV4cHJlc3NlZCBhcw0KICAgICAgICAgICAgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgYSByYXRpbyBvZiBsb3cgc3RyZXNzIHRvIGhpZ2ggc3RyZXNzIGFjY2VzcyBhYm92ZSB0aGlzIG51bWJlciwNCiAgICAgICAgICAgIDMwJSBoYXZlIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gYXZnIGpvYnMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gZW1wbG95bWVudCcsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0oZW1wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0oZW1wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShlbXBfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgZW1wbG95bWVudCBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIHRvIGVtcGxveW1lbnQgYWNjZXNzaWJsZSBvdmVyYWxsLCBleHByZXNzZWQgYXMNCiAgICAgICAgICAgIHRoZSBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgdGhpcyByYXRpbyBvZiBsb3cgc3RyZXNzIHRvIGhpZ2ggc3RyZXNzIGFjY2Vzcy4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV9lbXANCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIGpvYnMnLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3Aub3ZlcmFsbCA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogZW1wX3Njb3JlIC8gdG1wX3BvcC5vdmVyYWxsIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdBdmVyYWdlIGVtcGxveW1lbnQgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyBlbXBsb3ltZW50IHNjb3JlLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgVHJ1ZQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQsDQogICAgICAgIHRtcF9wb3ANCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHNjaG9vbHMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2Ugc2Nob29sIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gc2Nob29scycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0oc2Nob29sc19oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHNjaG9vbHNfbG93X3N0cmVzcykgLyBTVU0oc2Nob29sc19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2Ygc2Nob29scyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBtYW55IHNjaG9vbHMuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIHNjaG9vbHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIHNjaG9vbCBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHNjaG9vbHNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBzY2hvb2xzX2xvd19zdHJlc3M6OkZMT0FUL3NjaG9vbHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHNjaG9vbHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBzY2hvb2xzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2Ygc2Nob29scyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgaGFsZiBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSBzY2hvb2xzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiBzY2hvb2wgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBzY2hvb2xzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0Ugc2Nob29sc19sb3dfc3RyZXNzOjpGTE9BVC9zY2hvb2xzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBzY2hvb2xzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gc2Nob29scyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2Ygc2Nob29scyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIHNjaG9vbHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHNjaG9vbCBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHNjaG9vbHNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBzY2hvb2xzX2xvd19zdHJlc3M6OkZMT0FUL3NjaG9vbHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHNjaG9vbHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBzY2hvb2xzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBzY2hvb2xzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV9rMTINCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIEsxMiBzY2hvb2xzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLmsxMiA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogc2Nob29sc19zY29yZSAvIHRtcF9wb3AuazEyIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdBdmVyYWdlIEsxMiBzY2hvb2xzIHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgSzEyIHNjaG9vbHMgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2Nob29sIHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdBdmVyYWdlIHNjaG9vbCBiaWtlIHNoZWQgYWNjZXNzIHNjb3JlJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwb3BfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwb3BfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKHBvcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQgZGlzdGFuY2UNCiAgICAgICAgICAgIG9mIHNjaG9vbHMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCBzY2hvb2xzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgc2Nob29scyBpbiB0aGUgc3R1ZHkgYXJlYSBhcmUNCiAgICAgICAgICAgIGNvbm5lY3RlZCBieSB0aGUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBwZXJjZW50YWdlIHBlb3BsZQ0KICAgICAgICAgICAgd2l0aGluIGJpa2luZyBkaXN0YW5jZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3NjaG9vbHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzY2hvb2wgcG9wIHNoZWQgbWVkaWFuIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnTWVkaWFuIHNjaG9vbCBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBzY2hvb2xzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHNjaG9vbCBleHByZXNzZWQgYXMgYSBtZWRpYW4gb2YgYWxsDQogICAgICAgICAgICBzY2hvb2xzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBzY2hvb2xzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zY2hvb2xzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc2Nob29sIHBvcCBzaGVkIDcwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY2hvb2wgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gc2Nob29scw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBzY2hvb2wgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBzY2hvb2xzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHNjaG9vbHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc2Nob29scw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc2Nob29scy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNjaG9vbCBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2Nob29sIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHNjaG9vbHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggc2Nob29sIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgc2Nob29scyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBzY2hvb2xzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3NjaG9vbHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3NjaG9vbHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHRlY2huaWNhbC92b2NhdGlvbmFsIGNvbGxlZ2VzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBhdmVyYWdlIHRlY2huaWNhbC92b2NhdGlvbmFsIGNvbGxlZ2UgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBsb3cgc3RyZXNzIGFjY2VzcyB0byB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKGNvbGxlZ2VzX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0oY29sbGVnZXNfbG93X3N0cmVzcykgLyBTVU0oY29sbGVnZXNfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnTnVtYmVyIG9mIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBtYW55IHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcy4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBtZWRpYW4gY29sbGVnZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gY29sbGVnZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBjb2xsZWdlc19sb3dfc3RyZXNzOjpGTE9BVC9jb2xsZWdlc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCBoYWxmIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gNzB0aCBwZXJjZW50aWxlIGNvbGxlZ2VzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZSBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGNvbGxlZ2VzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgY29sbGVnZXNfbG93X3N0cmVzczo6RkxPQVQvY29sbGVnZXNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCA3MCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgY29sbGVnZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gY29sbGVnZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBjb2xsZWdlc19sb3dfc3RyZXNzOjpGTE9BVC9jb2xsZWdlc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDMwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX3RlY2gNCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcycsDQogICAgICAgIFNVTShDQVNFIFdIRU4gdG1wX3BvcC50ZWNoID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBjb2xsZWdlc19zY29yZSAvIHRtcF9wb3AudGVjaCBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gY29sbGVnZSBwb3Agc2hlZCBhdmVyYWdlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSBjb2xsZWdlIGJpa2Ugc2hlZCBhY2Nlc3Mgc2NvcmUnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHBvcF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHBvcF9sb3dfc3RyZXNzKTo6RkxPQVQgLyBTVU0ocG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2Vzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZCBkaXN0YW5jZQ0KICAgICAgICAgICAgb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIGluIHRoZSBzdHVkeSBhcmVhIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mDQogICAgICAgICAgICBhbGwgY29sbGVnZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBjb2xsZWdlcyBpbiB0aGUgc3R1ZHkgYXJlYSBhcmUNCiAgICAgICAgICAgIGNvbm5lY3RlZCBieSB0aGUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBwZXJjZW50YWdlIHBlb3BsZQ0KICAgICAgICAgICAgd2l0aGluIGJpa2luZyBkaXN0YW5jZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGNvbGxlZ2UgcG9wIHNoZWQgbWVkaWFuIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnTWVkaWFuIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBjb2xsZWdlIGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIGNvbGxlZ2VzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZXMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgaGFsZiBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZSBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGNvbGxlZ2UgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBjb2xsZWdlIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgY29sbGVnZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDcwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZSBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGNvbGxlZ2UgcG9wIHNoZWQgMzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRlY2gvdm9jYXRpb25hbCBjb2xsZWdlcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBjb2xsZWdlIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgY29sbGVnZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgdGVjaC92b2NhdGlvbmFsIGNvbGxlZ2VzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSB0ZWNoL3ZvY2F0aW9uYWwgY29sbGVnZSBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbGxlZ2VzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb2xsZWdlcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gdW5pdmVyc2l0aWVzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBhdmVyYWdlIHVuaXZlcnNpdHkgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBsb3cgc3RyZXNzIGFjY2VzcyB0byB1bml2ZXJzaXRpZXMnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHVuaXZlcnNpdGllc19sb3dfc3RyZXNzKSAvIFNVTSh1bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnTnVtYmVyIG9mIHVuaXZlcnNpdGllcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBtYW55IHVuaXZlcnNpdGllcy4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBtZWRpYW4gdW5pdmVyc2l0aWVzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJ01lZGlhbiBzY29yZSBvZiB1bml2ZXJzaXR5IGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgdW5pdmVyc2l0aWVzX2xvd19zdHJlc3M6OkZMT0FUL3VuaXZlcnNpdGllc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgdW5pdmVyc2l0aWVzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdW5pdmVyc2l0aWVzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgdW5pdmVyc2l0aWVzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCBoYWxmIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gNzB0aCBwZXJjZW50aWxlIHVuaXZlcnNpdGllcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgdW5pdmVyc2l0eSBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHVuaXZlcnNpdGllc19sb3dfc3RyZXNzOjpGTE9BVC91bml2ZXJzaXRpZXNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHVuaXZlcnNpdGllcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHVuaXZlcnNpdGllcyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgdW5pdmVyc2l0aWVzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCA3MCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgdW5pdmVyc2l0aWVzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzY29yZSBvZiB1bml2ZXJzaXR5IGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gdW5pdmVyc2l0aWVzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgdW5pdmVyc2l0aWVzX2xvd19zdHJlc3M6OkZMT0FUL3VuaXZlcnNpdGllc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgdW5pdmVyc2l0aWVzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdW5pdmVyc2l0aWVzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiB1bml2ZXJzaXRpZXMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDMwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX3VuaXYNCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIHVuaXZlcnNpdGllcycsDQogICAgICAgIFNVTShDQVNFIFdIRU4gdG1wX3BvcC51bml2ID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiB1bml2ZXJzaXRpZXNfc2NvcmUgLyB0bXBfcG9wLnVuaXYgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgdW5pdmVyc2l0aWVzIHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgdW5pdmVyc2l0aWVzIHNjb3JlLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgVHJ1ZQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQsDQogICAgICAgIHRtcF9wb3ANCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHVuaXZlcnNpdHkgcG9wIHNoZWQgYXZlcmFnZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJ0F2ZXJhZ2UgdW5pdmVyc2l0eSBiaWtlIHNoZWQgYWNjZXNzIHNjb3JlJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwb3BfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwb3BfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKHBvcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQgZGlzdGFuY2UNCiAgICAgICAgICAgIG9mIHVuaXZlcnNpdGllcyBpbiB0aGUgc3R1ZHkgYXJlYSBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZg0KICAgICAgICAgICAgYWxsIHVuaXZlcnNpdGllcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHVuaXZlcnNpdGllcyBpbiB0aGUgc3R1ZHkgYXJlYSBhcmUNCiAgICAgICAgICAgIGNvbm5lY3RlZCBieSB0aGUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBwZXJjZW50YWdlIHBlb3BsZQ0KICAgICAgICAgICAgd2l0aGluIGJpa2luZyBkaXN0YW5jZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gdW5pdmVyc2l0eSBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdPcHBvcnR1bml0eScsDQogICAgICAgICdNZWRpYW4gdW5pdmVyc2l0eSBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byB1bml2ZXJzaXRpZXMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggdW5pdmVyc2l0eSBleHByZXNzZWQgYXMgYSBtZWRpYW4gb2YgYWxsDQogICAgICAgICAgICB1bml2ZXJzaXRpZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHVuaXZlcnNpdGllcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCBoYWxmIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHVuaXZlcnNpdHkgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHVuaXZlcnNpdHkgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnT3Bwb3J0dW5pdHknLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHVuaXZlcnNpdHkgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gdW5pdmVyc2l0aWVzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHVuaXZlcnNpdHkgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICB1bml2ZXJzaXRpZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgdW5pdmVyc2l0aWVzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDcwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSB1bml2ZXJzaXR5IGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV91bml2ZXJzaXRpZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSB1bml2ZXJzaXR5IHBvcCBzaGVkIDMwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ09wcG9ydHVuaXR5JywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSB1bml2ZXJzaXR5IHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHVuaXZlcnNpdGllcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCB1bml2ZXJzaXR5IGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgdW5pdmVyc2l0aWVzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHVuaXZlcnNpdGllcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCAzMCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgdW5pdmVyc2l0eSBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3VuaXZlcnNpdGllcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfdW5pdmVyc2l0aWVzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBkb2N0b3JzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBhdmVyYWdlIGRvY3RvcnMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGRvY3RvcnMnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKGRvY3RvcnNfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShkb2N0b3JzX2xvd19zdHJlc3MpIC8gU1VNKGRvY3RvcnNfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnTnVtYmVyIG9mIGRvY3RvcnMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgbWFueSBkb2N0b3JzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIG1lZGlhbiBkb2N0b3JzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIGRvY3RvcnMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBkb2N0b3JzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgZG9jdG9yc19sb3dfc3RyZXNzOjpGTE9BVC9kb2N0b3JzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBkb2N0b3JzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gZG9jdG9ycyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIG1lZGlhbiBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIGRvY3RvcnMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgZG9jdG9ycyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiBkb2N0b3JzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gZG9jdG9yc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGRvY3RvcnNfbG93X3N0cmVzczo6RkxPQVQvZG9jdG9yc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgZG9jdG9ycyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIGRvY3RvcnMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIGRvY3RvcnMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDcwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDMwdGggcGVyY2VudGlsZSBkb2N0b3JzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIGRvY3RvcnMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBkb2N0b3JzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgZG9jdG9yc19sb3dfc3RyZXNzOjpGTE9BVC9kb2N0b3JzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBkb2N0b3JzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gZG9jdG9ycyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgZG9jdG9ycyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgMzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcG9wdWxhdGlvbiB3ZWlnaHRlZCBjZW5zdXMgYmxvY2sgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uLCB1c2VfZG9jdG9yDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIGRvY3RvcnMnLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3AuZG9jdG9yID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBkb2N0b3JzX3Njb3JlIC8gdG1wX3BvcC5kb2N0b3IgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgZG9jdG9ycyBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIGRvY3RvcnMgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gZG9jdG9ycyBwb3Agc2hlZCBhdmVyYWdlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIGRvY3RvcnMgYmlrZSBzaGVkIGFjY2VzcyBzY29yZScsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkIGRpc3RhbmNlDQogICAgICAgICAgICBvZiBkb2N0b3JzIGluIHRoZSBzdHVkeSBhcmVhIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mDQogICAgICAgICAgICBhbGwgZG9jdG9ycyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIGRvY3RvcnMgaW4gdGhlIHN0dWR5IGFyZWEgYXJlDQogICAgICAgICAgICBjb25uZWN0ZWQgYnkgdGhlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgcGVyY2VudGFnZSBwZW9wbGUNCiAgICAgICAgICAgIHdpdGhpbiBiaWtpbmcgZGlzdGFuY2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kb2N0b3JzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gZG9jdG9ycyBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBkb2N0b3JzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGRvY3RvcnMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggZG9jdG9ycyBvZmZpY2UgZXhwcmVzc2VkIGFzIGEgbWVkaWFuIG9mIGFsbA0KICAgICAgICAgICAgZG9jdG9ycyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgZG9jdG9ycyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCBoYWxmIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIGRvY3RvcnMgb2ZmaWNlIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGRvY3RvcnMgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgZG9jdG9ycyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBkb2N0b3JzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGRvY3RvcnMgb2ZmaWNlIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgZG9jdG9ycyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBkb2N0b3JzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDcwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBkb2N0b3JzIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGRvY3RvcnMgcG9wIHNoZWQgMzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgZG9jdG9ycyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBkb2N0b3JzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGRvY3RvcnMgb2ZmaWNlIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgZG9jdG9ycyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBkb2N0b3JzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBkb2N0b3JzIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfZG9jdG9ycy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGRlbnRpc3RzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBhdmVyYWdlIGRlbnRpc3RzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBsb3cgc3RyZXNzIGFjY2VzcyB0byBkZW50aXN0cycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0oZGVudGlzdHNfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShkZW50aXN0c19sb3dfc3RyZXNzKSAvIFNVTShkZW50aXN0c19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2YgZGVudGlzdHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgbWFueSBkZW50aXN0cy4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBtZWRpYW4gZGVudGlzdHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2YgZGVudGlzdHMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBkZW50aXN0c19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGRlbnRpc3RzX2xvd19zdHJlc3M6OkZMT0FUL2RlbnRpc3RzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBkZW50aXN0cyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIGRlbnRpc3RzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgZGVudGlzdHMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgZGVudGlzdHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgZGVudGlzdHMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBkZW50aXN0c19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGRlbnRpc3RzX2xvd19zdHJlc3M6OkZMT0FUL2RlbnRpc3RzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBkZW50aXN0cyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIGRlbnRpc3RzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBkZW50aXN0cyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIGRlbnRpc3RzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIGRlbnRpc3RzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gZGVudGlzdHNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBkZW50aXN0c19sb3dfc3RyZXNzOjpGTE9BVC9kZW50aXN0c19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgZGVudGlzdHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBkZW50aXN0cyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgZGVudGlzdHMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDMwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX2RlbnRpc3QNCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gZGVudGlzdHMnLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3AuZGVudGlzdCA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogZGVudGlzdHNfc2NvcmUgLyB0bXBfcG9wLmRlbnRpc3QgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgZGVudGlzdHMgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyBkZW50aXN0cyBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBkZW50aXN0cyBwb3Agc2hlZCBhdmVyYWdlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIGRlbnRpc3RzIGJpa2Ugc2hlZCBhY2Nlc3Mgc2NvcmUnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHBvcF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHBvcF9sb3dfc3RyZXNzKTo6RkxPQVQgLyBTVU0ocG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2Vzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZCBkaXN0YW5jZQ0KICAgICAgICAgICAgb2YgZGVudGlzdHMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCBkZW50aXN0cyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIGRlbnRpc3RzIGluIHRoZSBzdHVkeSBhcmVhIGFyZQ0KICAgICAgICAgICAgY29ubmVjdGVkIGJ5IHRoZSBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIHBlcmNlbnRhZ2UgcGVvcGxlDQogICAgICAgICAgICB3aXRoaW4gYmlraW5nIGRpc3RhbmNlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gZGVudGlzdHMgcG9wIHNoZWQgbWVkaWFuIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdNZWRpYW4gZGVudGlzdHMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gZGVudGlzdHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggZGVudGlzdHMgb2ZmaWNlIGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIGRlbnRpc3RzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBkZW50aXN0cyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCBoYWxmIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIGRlbnRpc3RzIG9mZmljZSBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGRlbnRpc3RzIHBvcCBzaGVkIDcwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIGRlbnRpc3RzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGRlbnRpc3RzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGRlbnRpc3RzIG9mZmljZSBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIGRlbnRpc3RzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIGRlbnRpc3RzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDcwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBkZW50aXN0cyBvZmZpY2UgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9kZW50aXN0cw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBkZW50aXN0cyBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBkZW50aXN0cyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBkZW50aXN0cw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBkZW50aXN0cyBvZmZpY2UgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBkZW50aXN0cyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBkZW50aXN0cyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCAzMCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgZGVudGlzdHMgb2ZmaWNlIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfZGVudGlzdHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2RlbnRpc3RzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gaG9zcGl0YWxzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBhdmVyYWdlIGhvc3BpdGFscyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gaG9zcGl0YWxzJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShob3NwaXRhbHNfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShob3NwaXRhbHNfbG93X3N0cmVzcykgLyBTVU0oaG9zcGl0YWxzX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ051bWJlciBvZiBob3NwaXRhbHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgbWFueSBob3NwaXRhbHMuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIGhvc3BpdGFscyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBzY29yZSBvZiBob3NwaXRhbHMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBob3NwaXRhbHNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBob3NwaXRhbHNfbG93X3N0cmVzczo6RkxPQVQvaG9zcGl0YWxzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBob3NwaXRhbHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBob3NwaXRhbHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBob3NwaXRhbHMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgaG9zcGl0YWxzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIGhvc3BpdGFscyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGhvc3BpdGFsc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGhvc3BpdGFsc19sb3dfc3RyZXNzOjpGTE9BVC9ob3NwaXRhbHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGhvc3BpdGFscyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIGhvc3BpdGFscyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgaG9zcGl0YWxzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCA3MCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgaG9zcGl0YWxzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIGhvc3BpdGFscyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGhvc3BpdGFsc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGhvc3BpdGFsc19sb3dfc3RyZXNzOjpGTE9BVC9ob3NwaXRhbHNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGhvc3BpdGFscyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIGhvc3BpdGFscyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgaG9zcGl0YWxzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV9ob3NwaXRhbA0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGFjY2VzcyB0byBob3NwaXRhbHMnLA0KICAgICAgICBTVU0oQ0FTRSBXSEVOIHRtcF9wb3AuaG9zcGl0YWwgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCAqIGhvc3BpdGFsc19zY29yZSAvIHRtcF9wb3AuaG9zcGl0YWwgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgaG9zcGl0YWwgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyBob3NwaXRhbCBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBob3NwaXRhbHMgcG9wIHNoZWQgYXZlcmFnZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBob3NwaXRhbHMgYmlrZSBzaGVkIGFjY2VzcyBzY29yZScsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkIGRpc3RhbmNlDQogICAgICAgICAgICBvZiBob3NwaXRhbHMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCBob3NwaXRhbHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBob3NwaXRhbHMgaW4gdGhlIHN0dWR5IGFyZWEgYXJlDQogICAgICAgICAgICBjb25uZWN0ZWQgYnkgdGhlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgcGVyY2VudGFnZSBwZW9wbGUNCiAgICAgICAgICAgIHdpdGhpbiBiaWtpbmcgZGlzdGFuY2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGhvc3BpdGFscyBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ01lZGlhbiBob3NwaXRhbHMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gaG9zcGl0YWxzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGhvc3BpdGFsIGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIGhvc3BpdGFscyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgaG9zcGl0YWxzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgaG9zcGl0YWwgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGhvc3BpdGFscyBwb3Agc2hlZCA3MHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBob3NwaXRhbHMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gaG9zcGl0YWxzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGhvc3BpdGFsIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgaG9zcGl0YWxzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIGhvc3BpdGFscyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCA3MCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgaG9zcGl0YWwgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGhvc3BpdGFscyBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBob3NwaXRhbHMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gaG9zcGl0YWxzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGhvc3BpdGFsIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgaG9zcGl0YWxzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIGhvc3BpdGFscyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCAzMCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgaG9zcGl0YWwgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9ob3NwaXRhbHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2hvc3BpdGFscy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHBoYXJtYWNpZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgcGhhcm1hY2llcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gcGhhcm1hY2llcycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocGhhcm1hY2llc19oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHBoYXJtYWNpZXNfbG93X3N0cmVzcykgLyBTVU0ocGhhcm1hY2llc19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2YgcGhhcm1hY2llcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBtYW55IHBoYXJtYWNpZXMuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIHBoYXJtYWNpZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2YgcGhhcm1hY2llcyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwaGFybWFjaWVzX2xvd19zdHJlc3M6OkZMT0FUL3BoYXJtYWNpZXNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBoYXJtYWNpZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBwaGFybWFjaWVzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgcGhhcm1hY2llcyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgaGFsZiBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSBwaGFybWFjaWVzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHBoYXJtYWNpZXMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwaGFybWFjaWVzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcGhhcm1hY2llc19sb3dfc3RyZXNzOjpGTE9BVC9waGFybWFjaWVzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwaGFybWFjaWVzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gcGhhcm1hY2llcyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgcGhhcm1hY2llcyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIHBoYXJtYWNpZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgcGhhcm1hY2llcyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwaGFybWFjaWVzX2xvd19zdHJlc3M6OkZMT0FUL3BoYXJtYWNpZXNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBoYXJtYWNpZXMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBwaGFybWFjaWVzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBwaGFybWFjaWVzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV9waGFybWFjeQ0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGFjY2VzcyB0byBwaGFybWFjaWVzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLnBoYXJtYWN5ID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBwaGFybWFjaWVzX3Njb3JlIC8gdG1wX3BvcC5waGFybWFjeSBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSBwaGFybWFjaWVzIHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgcGhhcm1hY2llcyBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwaGFybWFjaWVzIHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2UgcGhhcm1hY2llcyBiaWtlIHNoZWQgYWNjZXNzIHNjb3JlJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwb3BfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwb3BfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKHBvcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQgZGlzdGFuY2UNCiAgICAgICAgICAgIG9mIHBoYXJtYWNpZXMgaW4gdGhlIHN0dWR5IGFyZWEgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YNCiAgICAgICAgICAgIGFsbCBwaGFybWFjaWVzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcGhhcm1hY2llcyBpbiB0aGUgc3R1ZHkgYXJlYSBhcmUNCiAgICAgICAgICAgIGNvbm5lY3RlZCBieSB0aGUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBwZXJjZW50YWdlIHBlb3BsZQ0KICAgICAgICAgICAgd2l0aGluIGJpa2luZyBkaXN0YW5jZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwaGFybWFjaWVzIHBvcCBzaGVkIG1lZGlhbiBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnTWVkaWFuIHBoYXJtYWNpZXMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gcGhhcm1hY2llcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBwaGFybWFjeSBleHByZXNzZWQgYXMgYSBtZWRpYW4gb2YgYWxsDQogICAgICAgICAgICBwaGFybWFjaWVzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwaGFybWFjaWVzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgcGhhcm1hY3kgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9waGFybWFjaWVzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcGhhcm1hY2llcyBwb3Agc2hlZCA3MHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBwaGFybWFjaWVzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHBoYXJtYWNpZXMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggcGhhcm1hY3kgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBwaGFybWFjaWVzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHBoYXJtYWNpZXMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHBoYXJtYWN5IGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcGhhcm1hY2llcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBoYXJtYWNpZXMgcG9wIHNoZWQgMzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgcGhhcm1hY2llcyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBwaGFybWFjaWVzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHBoYXJtYWN5IGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgcGhhcm1hY2llcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwaGFybWFjaWVzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBwaGFybWFjeSBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BoYXJtYWNpZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSByZXRhaWwNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgcmV0YWlsIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JldGFpbCcsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHJldGFpbCcsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocmV0YWlsX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocmV0YWlsX2xvd19zdHJlc3MpIC8gU1VNKHJldGFpbF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2YgcmV0YWlsIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgcmV0YWlsLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIG1lZGlhbiByZXRhaWwgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmV0YWlsJywNCiAgICAgICAgJ01lZGlhbiBzY29yZSBvZiByZXRhaWwgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiByZXRhaWxfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSByZXRhaWxfbG93X3N0cmVzczo6RkxPQVQvcmV0YWlsX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiByZXRhaWwgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byByZXRhaWwgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiByZXRhaWwgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgcmV0YWlsIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JldGFpbCcsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgcmV0YWlsIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcmV0YWlsX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcmV0YWlsX2xvd19zdHJlc3M6OkZMT0FUL3JldGFpbF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcmV0YWlsIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gcmV0YWlsIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiByZXRhaWwgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDcwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDMwdGggcGVyY2VudGlsZSByZXRhaWwgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmV0YWlsJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzY29yZSBvZiByZXRhaWwgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiByZXRhaWxfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSByZXRhaWxfbG93X3N0cmVzczo6RkxPQVQvcmV0YWlsX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiByZXRhaWwgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byByZXRhaWwgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHJldGFpbCB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgMzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcG9wdWxhdGlvbiB3ZWlnaHRlZCBjZW5zdXMgYmxvY2sgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uLCB1c2VfcmV0YWlsDQopDQpTRUxFQ1QgICdSZXRhaWwnLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBhY2Nlc3MgdG8gcmV0YWlsJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLnJldGFpbCA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogcmV0YWlsX3Njb3JlIC8gdG1wX3BvcC5yZXRhaWwgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgcmV0YWlsIHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgcmV0YWlsIHNjb3JlLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgVHJ1ZQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQsDQogICAgICAgIHRtcF9wb3ANCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHJldGFpbCBwb3Agc2hlZCBhdmVyYWdlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmV0YWlsJywNCiAgICAgICAgJ0F2ZXJhZ2UgcmV0YWlsIGJpa2Ugc2hlZCBhY2Nlc3Mgc2NvcmUnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHBvcF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHBvcF9sb3dfc3RyZXNzKTo6RkxPQVQgLyBTVU0ocG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2Vzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZCBkaXN0YW5jZQ0KICAgICAgICAgICAgb2YgcmV0YWlsIGNsdXN0ZXJzIGluIHRoZSBzdHVkeSBhcmVhIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mDQogICAgICAgICAgICBhbGwgcmV0YWlsIGNsdXN0ZXJzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcmV0YWlsIGNsdXN0ZXJzIGluIHRoZSBzdHVkeSBhcmVhIGFyZQ0KICAgICAgICAgICAgY29ubmVjdGVkIGJ5IHRoZSBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIHBlcmNlbnRhZ2UgcGVvcGxlDQogICAgICAgICAgICB3aXRoaW4gYmlraW5nIGRpc3RhbmNlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwuZ2VvbV9wb2x5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHJldGFpbCBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZXRhaWwnLA0KICAgICAgICAnTWVkaWFuIHJldGFpbCBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byByZXRhaWwNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggcmV0YWlsIGNsdXN0ZXIgZXhwcmVzc2VkIGFzIGEgbWVkaWFuIG9mIGFsbA0KICAgICAgICAgICAgcmV0YWlsIGNsdXN0ZXJzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiByZXRhaWwgY2x1c3RlcnMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgaGFsZiBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSByZXRhaWwgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3JldGFpbC5nZW9tX3BvbHksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcmV0YWlsIHBvcCBzaGVkIDcwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JldGFpbCcsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgcmV0YWlsIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHJldGFpbA0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCByZXRhaWwgY2x1c3RlciBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHJldGFpbCBjbHVzdGVycyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiByZXRhaWwgY2x1c3RlcnMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHJldGFpbCBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3JldGFpbA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcmV0YWlsLmdlb21fcG9seSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSByZXRhaWwgcG9wIHNoZWQgMzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmV0YWlsJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSByZXRhaWwgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gcmV0YWlsDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHJldGFpbCBjbHVzdGVyIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgcmV0YWlsIGNsdXN0ZXJzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHJldGFpbCBjbHVzdGVycyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCAzMCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgcmV0YWlsIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcmV0YWlsDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9yZXRhaWwuZ2VvbV9wb2x5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHN1cGVybWFya2V0cw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gYXZlcmFnZSBzdXBlcm1hcmtldHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHN1cGVybWFya2V0cycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0oc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0oc3VwZXJtYXJrZXRzX2xvd19zdHJlc3MpIC8gU1VNKHN1cGVybWFya2V0c19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2Ygc3VwZXJtYXJrZXRzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgc3VwZXJtYXJrZXRzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIG1lZGlhbiBzdXBlcm1hcmtldHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2Ygc3VwZXJtYXJrZXRzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0Ugc3VwZXJtYXJrZXRzX2xvd19zdHJlc3M6OkZMT0FUL3N1cGVybWFya2V0c19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2Ygc3VwZXJtYXJrZXRzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gc3VwZXJtYXJrZXRzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2Ygc3VwZXJtYXJrZXRzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCBoYWxmIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gNzB0aCBwZXJjZW50aWxlIHN1cGVybWFya2V0cyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiBzdXBlcm1hcmtldHMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBzdXBlcm1hcmtldHNfbG93X3N0cmVzczo6RkxPQVQvc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBzdXBlcm1hcmtldHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBzdXBlcm1hcmtldHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHN1cGVybWFya2V0cyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIHN1cGVybWFya2V0cyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzY29yZSBvZiBzdXBlcm1hcmtldHMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBzdXBlcm1hcmtldHNfbG93X3N0cmVzczo6RkxPQVQvc3VwZXJtYXJrZXRzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBzdXBlcm1hcmtldHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBzdXBlcm1hcmtldHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHN1cGVybWFya2V0cyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgMzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcG9wdWxhdGlvbiB3ZWlnaHRlZCBjZW5zdXMgYmxvY2sgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uLCB1c2VfZ3JvY2VyeQ0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGFjY2VzcyB0byBncm9jZXJ5IHN0b3JlcycsDQogICAgICAgIFNVTShDQVNFIFdIRU4gdG1wX3BvcC5ncm9jZXJ5ID0gMCBUSEVOIDAgRUxTRSBwYXJ0aWFsX3AgKiBzdXBlcm1hcmtldHNfc2NvcmUgLyB0bXBfcG9wLmdyb2NlcnkgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgZ3JvY2VyeSBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIGdyb2Nlcnkgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc3VwZXJtYXJrZXRzIHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc3VwZXJtYXJrZXRzIGJpa2Ugc2hlZCBhY2Nlc3Mgc2NvcmUnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHBvcF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHBvcF9sb3dfc3RyZXNzKTo6RkxPQVQgLyBTVU0ocG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2Vzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZCBkaXN0YW5jZQ0KICAgICAgICAgICAgb2Ygc3VwZXJtYXJrZXRzIGluIHRoZSBzdHVkeSBhcmVhIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mDQogICAgICAgICAgICBhbGwgc3VwZXJtYXJrZXRzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgc3VwZXJtYXJrZXRzIGluIHRoZSBzdHVkeSBhcmVhIGFyZQ0KICAgICAgICAgICAgY29ubmVjdGVkIGJ5IHRoZSBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIHBlcmNlbnRhZ2UgcGVvcGxlDQogICAgICAgICAgICB3aXRoaW4gYmlraW5nIGRpc3RhbmNlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzdXBlcm1hcmtldHMgcG9wIHNoZWQgbWVkaWFuIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdNZWRpYW4gc3VwZXJtYXJrZXRzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHN1cGVybWFya2V0cw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBzdXBlcm1hcmtldCBleHByZXNzZWQgYXMgYSBtZWRpYW4gb2YgYWxsDQogICAgICAgICAgICBzdXBlcm1hcmtldHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHN1cGVybWFya2V0cyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCBoYWxmIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHN1cGVybWFya2V0cyBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc3VwZXJtYXJrZXRzIHBvcCBzaGVkIDcwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHN1cGVybWFya2V0cyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBzdXBlcm1hcmtldHMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggc3VwZXJtYXJrZXQgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBzdXBlcm1hcmtldHMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2Ygc3VwZXJtYXJrZXRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDcwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBzdXBlcm1hcmtldHMgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3N1cGVybWFya2V0cy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHN1cGVybWFya2V0cyBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzdXBlcm1hcmtldHMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gc3VwZXJtYXJrZXRzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHN1cGVybWFya2V0IGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgc3VwZXJtYXJrZXRzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHN1cGVybWFya2V0cyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCAzMCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgc3VwZXJtYXJrZXRzIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc3VwZXJtYXJrZXRzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zdXBlcm1hcmtldHMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBzb2NpYWxfc2VydmljZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2Ugc29jaWFsX3NlcnZpY2VzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnQXZlcmFnZSBzY29yZSBvZiBsb3cgc3RyZXNzIGFjY2VzcyB0byBzb2NpYWwgc2VydmljZXMnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHNvY2lhbF9zZXJ2aWNlc19sb3dfc3RyZXNzKSAvIFNVTShzb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnTnVtYmVyIG9mIHNvY2lhbCBzZXJ2aWNlcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBtYW55IHNvY2lhbCBzZXJ2aWNlcy4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBtZWRpYW4gc29jaWFsX3NlcnZpY2VzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIHNvY2lhbCBzZXJ2aWNlcyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHNvY2lhbF9zZXJ2aWNlc19sb3dfc3RyZXNzOjpGTE9BVC9zb2NpYWxfc2VydmljZXNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHNvY2lhbCBzZXJ2aWNlcyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHNvY2lhbCBzZXJ2aWNlcyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIG1lZGlhbiBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHNvY2lhbCBzZXJ2aWNlcyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgaGFsZiBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSBzb2NpYWxfc2VydmljZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgc2NvcmUgb2Ygc29jaWFsIHNlcnZpY2VzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0Ugc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3M6OkZMT0FUL3NvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2Ygc29jaWFsIHNlcnZpY2VzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gc29jaWFsIHNlcnZpY2VzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBzb2NpYWwgc2VydmljZXMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDcwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDMwdGggcGVyY2VudGlsZSBzb2NpYWxfc2VydmljZXMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2Ygc29jaWFsIHNlcnZpY2VzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjMpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0Ugc29jaWFsX3NlcnZpY2VzX2xvd19zdHJlc3M6OkZMT0FUL3NvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2Ygc29jaWFsIHNlcnZpY2VzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gc29jaWFsIHNlcnZpY2VzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBzb2NpYWwgc2VydmljZXMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDMwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBvcHVsYXRpb24gd2VpZ2h0ZWQgY2Vuc3VzIGJsb2NrIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbiwgdXNlX3NvY2lhbF9zdmNzDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIHNvY2lhbCBzZXJ2aWNlcycsDQogICAgICAgIFNVTShDQVNFIFdIRU4gdG1wX3BvcC5zb2NpYWxfc3ZjcyA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogc29jaWFsX3NlcnZpY2VzX3Njb3JlIC8gdG1wX3BvcC5zb2NpYWxfc3ZjcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSBzb2NpYWwgc2VydmljZXMgc2NvcmUgZm9yIHBvcHVsYXRpb24gZ3JpZHMNCiAgICAgICAgICAgIHdlaWdodGVkIGJ5IHBvcHVsYXRpb24uJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSByZWNlaXZlZA0KICAgICAgICAgICAgdGhpcyBzb2NpYWwgc2VydmljZXMgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc29jaWFsX3NlcnZpY2VzIHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc29jaWFsX3NlcnZpY2VzIGJpa2Ugc2hlZCBhY2Nlc3Mgc2NvcmUnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHBvcF9oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKHBvcF9sb3dfc3RyZXNzKTo6RkxPQVQgLyBTVU0ocG9wX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2Vzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZCBkaXN0YW5jZQ0KICAgICAgICAgICAgb2Ygc29jaWFsIHNlcnZpY2VzIGluIHRoZSBzdHVkeSBhcmVhIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mDQogICAgICAgICAgICBhbGwgc29jaWFsIHNlcnZpY2VzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgc29jaWFsX3NlcnZpY2VzIGluIHRoZSBzdHVkeSBhcmVhIGFyZQ0KICAgICAgICAgICAgY29ubmVjdGVkIGJ5IHRoZSBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIHBlcmNlbnRhZ2UgcGVvcGxlDQogICAgICAgICAgICB3aXRoaW4gYmlraW5nIGRpc3RhbmNlLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBzb2NpYWxfc2VydmljZXMgcG9wIHNoZWQgbWVkaWFuIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnQ29yZSBTZXJ2aWNlcycsDQogICAgICAgICdNZWRpYW4gc29jaWFsX3NlcnZpY2VzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHNvY2lhbCBzZXJ2aWNlcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBzb2NpYWwgc2VydmljZSBsb2NhdGlvbiBleHByZXNzZWQgYXMgYSBtZWRpYW4gb2YgYWxsDQogICAgICAgICAgICBzb2NpYWwgc2VydmljZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHNvY2lhbCBzZXJ2aWNlcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCBoYWxmIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHNvY2lhbF9zZXJ2aWNlcyBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gc29jaWFsX3NlcnZpY2VzIHBvcCBzaGVkIDcwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ0NvcmUgU2VydmljZXMnLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNvY2lhbF9zZXJ2aWNlcyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBzb2NpYWwgc2VydmljZXMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggc29jaWFsIHNlcnZpY2UgbG9jYXRpb24gZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBzb2NpYWwgc2VydmljZXMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2Ygc29jaWFsIHNlcnZpY2VzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDcwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBzb2NpYWxfc2VydmljZXMgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3NvY2lhbF9zZXJ2aWNlcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHNvY2lhbF9zZXJ2aWNlcyBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdDb3JlIFNlcnZpY2VzJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzb2NpYWxfc2VydmljZXMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gc29jaWFsIHNlcnZpY2VzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHNvY2lhbCBzZXJ2aWNlIGxvY2F0aW9uIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgc29jaWFsIHNlcnZpY2VzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHNvY2lhbCBzZXJ2aWNlcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCAzMCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgc29jaWFsX3NlcnZpY2VzIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2Ffc29jaWFsX3NlcnZpY2VzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9zb2NpYWxfc2VydmljZXMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBwYXJrcw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gYXZlcmFnZSBwYXJrcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgbG93IHN0cmVzcyBhY2Nlc3MgdG8gcGFya3MnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHBhcmtzX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocGFya3NfbG93X3N0cmVzcykgLyBTVU0ocGFya3NfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnTnVtYmVyIG9mIHBhcmtzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgcGFya3MuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gbWVkaWFuIHBhcmtzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIHBhcmtzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcGFya3NfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwYXJrc19sb3dfc3RyZXNzOjpGTE9BVC9wYXJrc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcGFya3MgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBwYXJrcyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIG1lZGlhbiBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHBhcmtzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCBoYWxmIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gNzB0aCBwZXJjZW50aWxlIHBhcmtzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHBhcmtzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcGFya3NfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwYXJrc19sb3dfc3RyZXNzOjpGTE9BVC9wYXJrc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcGFya3MgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byBwYXJrcyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDcwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgcGFya3Mgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDcwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDMwdGggcGVyY2VudGlsZSBwYXJrcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzY29yZSBvZiBwYXJrcyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBhcmtzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcGFya3NfbG93X3N0cmVzczo6RkxPQVQvcGFya3NfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBhcmtzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gcGFya3MgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHBhcmtzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCAzMCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwb3B1bGF0aW9uIHdlaWdodGVkIGNlbnN1cyBibG9jayBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24sIHVzZV9wYXJrcw0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGFjY2VzcyB0byBwYXJrcycsDQogICAgICAgIFNVTShDQVNFIFdIRU4gdG1wX3BvcC5wYXJrcyA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogcGFya3Nfc2NvcmUgLyB0bXBfcG9wLnBhcmtzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdBdmVyYWdlIHBhcmtzIHNjb3JlIGZvciBwb3B1bGF0aW9uIGdyaWRzDQogICAgICAgICAgICB3ZWlnaHRlZCBieSBwb3B1bGF0aW9uLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgcmVjZWl2ZWQNCiAgICAgICAgICAgIHRoaXMgcGFya3Mgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcGFya3MgcG9wIHNoZWQgYXZlcmFnZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnQXZlcmFnZSBwYXJrcyBiaWtlIHNoZWQgYWNjZXNzIHNjb3JlJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShwb3BfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTShwb3BfbG93X3N0cmVzcyk6OkZMT0FUIC8gU1VNKHBvcF9oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQgZGlzdGFuY2UNCiAgICAgICAgICAgIG9mIHBhcmtzIGluIHRoZSBzdHVkeSBhcmVhIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mDQogICAgICAgICAgICBhbGwgcGFya3MgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwYXJrcyBpbiB0aGUgc3R1ZHkgYXJlYSBhcmUNCiAgICAgICAgICAgIGNvbm5lY3RlZCBieSB0aGUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBwZXJjZW50YWdlIHBlb3BsZQ0KICAgICAgICAgICAgd2l0aGluIGJpa2luZyBkaXN0YW5jZS4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3BhcmtzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9wYXJrcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHBhcmtzIHBvcCBzaGVkIG1lZGlhbiBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnTWVkaWFuIHBhcmtzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHBhcmtzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHBhcmtzIGV4cHJlc3NlZCBhcyBhIG1lZGlhbiBvZiBhbGwNCiAgICAgICAgICAgIHBhcmtzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwYXJrcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCBoYWxmIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHBhcmtzIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfcGFya3MNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3BhcmtzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcGFya3MgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgcGFya3MgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gcGFya3MNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggcGFya3MgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBwYXJrcyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzMwJSBvZiBwYXJrcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCA3MCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgcGFya3MgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9wYXJrcw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfcGFya3MuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBwYXJrcyBwb3Agc2hlZCAzMHRoIHBlcmNlbnRpbGUgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBwYXJrcyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC4zKSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBwYXJrcw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBwYXJrcyBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwNCiAgICAgICAgICAgIHBhcmtzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBhcmtzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBwYXJrcyBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3BhcmtzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9wYXJrcy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIHRyYWlscw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gYXZlcmFnZSB0cmFpbHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRyYWlscycsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0odHJhaWxzX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0odHJhaWxzX2xvd19zdHJlc3MpIC8gU1VNKHRyYWlsc19oaWdoX3N0cmVzcykNCiAgICAgICAgICAgICAgICBFTkQsDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdOdW1iZXIgb2YgdHJhaWxzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGFuIGF2ZXJhZ2Ugb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlDQogICAgICAgICAgICBsb3cgc3RyZXNzIGFjY2VzcyB0byB0aGlzIG1hbnkgdHJhaWxzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIG1lZGlhbiB0cmFpbHMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICdNZWRpYW4gc2NvcmUgb2YgdHJhaWxzIGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gdHJhaWxzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgdHJhaWxzX2xvd19zdHJlc3M6OkZMT0FUL3RyYWlsc19oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgdHJhaWxzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdHJhaWxzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgbWVkaWFuIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgdHJhaWxzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCBoYWxmIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gNzB0aCBwZXJjZW50aWxlIHRyYWlscyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiB0cmFpbHMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiB0cmFpbHNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSB0cmFpbHNfbG93X3N0cmVzczo6RkxPQVQvdHJhaWxzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB0cmFpbHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0cmFpbHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHRyYWlscyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgNzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gMzB0aCBwZXJjZW50aWxlIHRyYWlscyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJzMwdGggcGVyY2VudGlsZSBzY29yZSBvZiB0cmFpbHMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiB0cmFpbHNfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSB0cmFpbHNfbG93X3N0cmVzczo6RkxPQVQvdHJhaWxzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB0cmFpbHMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0cmFpbHMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnNzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHRyYWlscyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgMzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcG9wdWxhdGlvbiB3ZWlnaHRlZCBjZW5zdXMgYmxvY2sgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uLCB1c2VfdHJhaWxzDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIHRyYWlscycsDQogICAgICAgIFNVTShDQVNFIFdIRU4gdG1wX3BvcC50cmFpbHMgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCAqIHRyYWlsc19zY29yZSAvIHRtcF9wb3AudHJhaWxzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdBdmVyYWdlIHRyYWlscyBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIHRyYWlscyBzY29yZS4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIFRydWUNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLA0KICAgICAgICB0bXBfcG9wDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0gY29tbXVuaXR5X2NlbnRlcnMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tIGF2ZXJhZ2UgY29tbXVuaXR5X2NlbnRlcnMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGNvbW11bml0eSBjZW50ZXJzJywNCiAgICAgICAgQ0FTRSAgICBXSEVOIFNVTShjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcykgPSAwIFRIRU4gMA0KICAgICAgICAgICAgICAgIEVMU0UgU1VNKGNvbW11bml0eV9jZW50ZXJzX2xvd19zdHJlc3MpIC8gU1VNKGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzKQ0KICAgICAgICAgICAgICAgIEVORCwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ051bWJlciBvZiBjb21tdW5pdHkgY2VudGVycyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZQ0KICAgICAgICAgICAgbG93IHN0cmVzcyBhY2Nlc3MgdG8gdGhpcyBtYW55IGNvbW11bml0eSBjZW50ZXJzLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIG1lZGlhbiBjb21tdW5pdHkgY2VudGVycyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJ01lZGlhbiBzY29yZSBvZiBjb21tdW5pdHkgY2VudGVycyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzczo6RkxPQVQvY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGNvbW11bml0eSBjZW50ZXJzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gY29tbXVuaXR5IGNlbnRlcnMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSBtZWRpYW4gb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBjb21tdW5pdHkgY2VudGVycyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgaGFsZiBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDcwdGggcGVyY2VudGlsZSBjb21tdW5pdHkgY2VudGVycyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiBjb21tdW5pdHkgY2VudGVycyBhY2Nlc3MnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgY29tbXVuaXR5X2NlbnRlcnNfbG93X3N0cmVzczo6RkxPQVQvY29tbXVuaXR5X2NlbnRlcnNfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIGNvbW11bml0eSBjZW50ZXJzIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gY29tbXVuaXR5IGNlbnRlcnMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIGNvbW11bml0eSBjZW50ZXJzIHdpdGhpbg0KICAgICAgICAgICAgYmlraW5nIGRpc3RhbmNlLCA3MCUgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSAzMHRoIHBlcmNlbnRpbGUgY29tbXVuaXR5IGNlbnRlcnMgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgc2NvcmUgb2YgY29tbXVuaXR5IGNlbnRlcnMgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIGNvbW11bml0eV9jZW50ZXJzX2xvd19zdHJlc3M6OkZMT0FUL2NvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBjb21tdW5pdHkgY2VudGVycyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIGNvbW11bml0eSBjZW50ZXJzIGFjY2Vzc2libGUgYnkgaGlnaCBzdHJlc3MNCiAgICAgICAgICAgIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZQ0KICAgICAgICAgICAgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBwb3B1bGF0aW9uIGdyaWRzIGluIHRoaXMgc3R1ZHkgYXJlYQ0KICAgICAgICAgICAgaGF2ZSBsb3cgc3RyZXNzIGFjY2VzcyB0byBhIGhpZ2hlciByYXRpbyBvZiBjb21tdW5pdHkgY2VudGVycyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgMzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcG9wdWxhdGlvbiB3ZWlnaHRlZCBjZW5zdXMgYmxvY2sgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uLCB1c2VfY29tbV9jdHJzDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJ0F2ZXJhZ2Ugc2NvcmUgb2YgYWNjZXNzIHRvIGNvbW11bml0eSBjZW50ZXJzJywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLmNvbW1fY3RycyA9IDAgVEhFTiAwIEVMU0UgcGFydGlhbF9wICogY29tbXVuaXR5X2NlbnRlcnNfc2NvcmUgLyB0bXBfcG9wLmNvbW1fY3RycyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnQXZlcmFnZSBjb21tdW5pdHkgY2VudGVycyBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIGNvbW11bml0eSBjZW50ZXJzIHNjb3JlLicsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgVHJ1ZQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQsDQogICAgICAgIHRtcF9wb3ANCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGNvbW11bml0eSBjZW50ZXJzIHBvcCBzaGVkIGF2ZXJhZ2UgbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJ0F2ZXJhZ2UgY29tbXVuaXR5IGNlbnRlcnMgYmlrZSBzaGVkIGFjY2VzcyBzY29yZScsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkIGRpc3RhbmNlDQogICAgICAgICAgICBvZiBjb21tdW5pdHkgY2VudGVycyBpbiB0aGUgc3R1ZHkgYXJlYSBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZg0KICAgICAgICAgICAgYWxsIGNvbW11bml0eSBjZW50ZXJzIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnT24gYXZlcmFnZSwgY29tbXVuaXR5IGNlbnRlcnMgaW4gdGhlIHN0dWR5IGFyZWEgYXJlDQogICAgICAgICAgICBjb25uZWN0ZWQgYnkgdGhlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgcGVyY2VudGFnZSBwZW9wbGUNCiAgICAgICAgICAgIHdpdGhpbiBiaWtpbmcgZGlzdGFuY2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSBjb21tdW5pdHkgY2VudGVycyBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdSZWNyZWF0aW9uJywNCiAgICAgICAgJ01lZGlhbiBjb21tdW5pdHkgY2VudGVycyBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC41KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byBjb21tdW5pdHkgY2VudGVycw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCBjb21tdW5pdHkgY2VudGVycyBleHByZXNzZWQgYXMgYSBtZWRpYW4gb2YgYWxsDQogICAgICAgICAgICBjb21tdW5pdHkgY2VudGVycyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0hhbGYgb2YgY29tbXVuaXR5IGNlbnRlcnMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgaGFsZiBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSBjb21tdW5pdHkgY2VudGVycyBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycy5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIGNvbW11bml0eSBjZW50ZXJzIHBvcCBzaGVkIDcwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1JlY3JlYXRpb24nLA0KICAgICAgICAnNzB0aCBwZXJjZW50aWxlIGNvbW11bml0eSBjZW50ZXJzIHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGNvbW11bml0eSBjZW50ZXJzDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIGNvbW11bml0eSBjZW50ZXJzIGV4cHJlc3NlZCBhcyB0aGUgNzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgY29tbXVuaXR5IGNlbnRlcnMgaW4gdGhlIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCczMCUgb2YgY29tbXVuaXR5IGNlbnRlcnMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIGNvbW11bml0eSBjZW50ZXJzIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX2NvbW11bml0eV9jZW50ZXJzLmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gY29tbXVuaXR5IGNlbnRlcnMgcG9wIHNoZWQgMzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnUmVjcmVhdGlvbicsDQogICAgICAgICczMHRoIHBlcmNlbnRpbGUgY29tbXVuaXR5IGNlbnRlcnMgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gY29tbXVuaXR5IGNlbnRlcnMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggY29tbXVuaXR5IGNlbnRlcnMgZXhwcmVzc2VkIGFzIHRoZSAzMHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICBjb21tdW5pdHkgY2VudGVycyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiBjb21tdW5pdHkgY2VudGVycyBpbiB0aGUgc3R1ZHkgYXJlYSBoYXZlIGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbm5lY3Rpb25zIHRvIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhpbiBiaWtpbmcNCiAgICAgICAgICAgIGRpc3RhbmNlLCAzMCUgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgY29tbXVuaXR5IGNlbnRlcnMgZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV9jb21tdW5pdHlfY2VudGVycw0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfY29tbXVuaXR5X2NlbnRlcnMuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSB0cmFuc2l0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLSBhdmVyYWdlIHRyYW5zaXQgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnVHJhbnNpdCcsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRyYW5zaXQnLA0KICAgICAgICBDQVNFICAgIFdIRU4gU1VNKHRyYW5zaXRfaGlnaF9zdHJlc3MpID0gMCBUSEVOIDANCiAgICAgICAgICAgICAgICBFTFNFIFNVTSh0cmFuc2l0X2xvd19zdHJlc3MpIC8gU1VNKHRyYW5zaXRfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnTnVtYmVyIG9mIHRyYW5zaXQgc3RhdGlvbnMgYWNjZXNzaWJsZSBieSBsb3cgc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgYW4gYXZlcmFnZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUNCiAgICAgICAgICAgIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgbWFueSB0cmFuc2l0IHN0YXRpb25zLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIG1lZGlhbiB0cmFuc2l0IGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1RyYW5zaXQnLA0KICAgICAgICAnTWVkaWFuIHNjb3JlIG9mIHRyYW5zaXQgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuNSkgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiB0cmFuc2l0X2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgdHJhbnNpdF9sb3dfc3RyZXNzOjpGTE9BVC90cmFuc2l0X2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB0cmFuc2l0IHN0YXRpb25zIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdHJhbnNpdCBzdGF0aW9ucyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIG1lZGlhbiBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdIYWxmIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHRyYW5zaXQgc3RhdGlvbnMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIGhhbGYgaGF2ZSBhY2Nlc3MgdG8gYSBsb3dlciByYXRpby4nLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGdlbmVyYXRlZC5zYV9wb3BfZ3JpZC5nZW9tZXRyeSxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSA3MHRoIHBlcmNlbnRpbGUgdHJhbnNpdCBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdUcmFuc2l0JywNCiAgICAgICAgJzcwdGggcGVyY2VudGlsZSBzY29yZSBvZiB0cmFuc2l0IGFjY2VzcycsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjcpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gdHJhbnNpdF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHRyYW5zaXRfbG93X3N0cmVzczo6RkxPQVQvdHJhbnNpdF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgdHJhbnNpdCBzdGF0aW9ucyBhY2Nlc3NpYmxlIGJ5IGxvdyBzdHJlc3MNCiAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRyYW5zaXQgc3RhdGlvbnMgYWNjZXNzaWJsZSBieSBoaWdoIHN0cmVzcw0KICAgICAgICAgICAgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhlDQogICAgICAgICAgICBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHBvcHVsYXRpb24gZ3JpZHMgaW4gdGhpcyBzdHVkeSBhcmVhDQogICAgICAgICAgICBoYXZlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIGEgaGlnaGVyIHJhdGlvIG9mIHRyYW5zaXQgc3RhdGlvbnMgd2l0aGluDQogICAgICAgICAgICBiaWtpbmcgZGlzdGFuY2UsIDcwJSBoYXZlIGFjY2VzcyB0byBhIGxvd2VyIHJhdGlvLicsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZ2VuZXJhdGVkLnNhX3BvcF9ncmlkLmdlb21ldHJ5LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIDMwdGggcGVyY2VudGlsZSB0cmFuc2l0IGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1RyYW5zaXQnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHNjb3JlIG9mIHRyYW5zaXQgYWNjZXNzJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiB0cmFuc2l0X2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgdHJhbnNpdF9sb3dfc3RyZXNzOjpGTE9BVC90cmFuc2l0X2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiB0cmFuc2l0IHN0YXRpb25zIGFjY2Vzc2libGUgYnkgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29tcGFyZWQgdG8gdHJhbnNpdCBzdGF0aW9ucyBhY2Nlc3NpYmxlIGJ5IGhpZ2ggc3RyZXNzDQogICAgICAgICAgICBleHByZXNzZWQgYXMgdGhlIDMwdGggcGVyY2VudGlsZSBvZiBhbGwgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGUNCiAgICAgICAgICAgIHN0dWR5IGFyZWEnLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCc3MCUgb2YgcG9wdWxhdGlvbiBncmlkcyBpbiB0aGlzIHN0dWR5IGFyZWENCiAgICAgICAgICAgIGhhdmUgbG93IHN0cmVzcyBhY2Nlc3MgdG8gYSBoaWdoZXIgcmF0aW8gb2YgdHJhbnNpdCBzdGF0aW9ucyB3aXRoaW4NCiAgICAgICAgICAgIGJpa2luZyBkaXN0YW5jZSwgMzAlIGhhdmUgYWNjZXNzIHRvIGEgbG93ZXIgcmF0aW8uJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gcG9wdWxhdGlvbiB3ZWlnaHRlZCBjZW5zdXMgYmxvY2sgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uLCB1c2VfdHJhbnNpdA0KKQ0KU0VMRUNUICAnVHJhbnNpdCcsDQogICAgICAgICdBdmVyYWdlIHNjb3JlIG9mIGFjY2VzcyB0byB0cmFuc2l0JywNCiAgICAgICAgU1VNKENBU0UgV0hFTiB0bXBfcG9wLnRyYW5zaXQgPSAwIFRIRU4gMCBFTFNFIHBhcnRpYWxfcCAqIHRyYW5zaXRfc2NvcmUgLyB0bXBfcG9wLnRyYW5zaXQgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ0F2ZXJhZ2UgdHJhbnNpdCBzY29yZSBmb3IgcG9wdWxhdGlvbiBncmlkcw0KICAgICAgICAgICAgd2VpZ2h0ZWQgYnkgcG9wdWxhdGlvbi4nLCdcblxzKycsJyAnLCdnJyksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdPbiBhdmVyYWdlLCBwb3B1bGF0aW9uIGdyaWRzIGluIHRoZSBzdHVkeSBhcmVhIHJlY2VpdmVkDQogICAgICAgICAgICB0aGlzIHRyYW5zaXQgc2NvcmUuJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICBUcnVlDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCwNCiAgICAgICAgdG1wX3BvcA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnksYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gdHJhbnNpdCBwb3Agc2hlZCBhdmVyYWdlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnVHJhbnNpdCcsDQogICAgICAgICdBdmVyYWdlIHRyYW5zaXQgYmlrZSBzaGVkIGFjY2VzcyBzY29yZScsDQogICAgICAgIENBU0UgICAgV0hFTiBTVU0ocG9wX2hpZ2hfc3RyZXNzKSA9IDAgVEhFTiAwDQogICAgICAgICAgICAgICAgRUxTRSBTVU0ocG9wX2xvd19zdHJlc3MpOjpGTE9BVCAvIFNVTShwb3BfaGlnaF9zdHJlc3MpDQogICAgICAgICAgICAgICAgRU5ELA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzDQogICAgICAgICAgICBjb21wYXJlZCB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkIGRpc3RhbmNlDQogICAgICAgICAgICBvZiB0cmFuc2l0IHN0YXRpb25zIGluIHRoZSBzdHVkeSBhcmVhIGV4cHJlc3NlZCBhcyBhbiBhdmVyYWdlIG9mDQogICAgICAgICAgICBhbGwgdHJhbnNpdCBzdGF0aW9ucyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ09uIGF2ZXJhZ2UsIHRyYW5zaXQgc3RhdGlvbnMgaW4gdGhlIHN0dWR5IGFyZWEgYXJlDQogICAgICAgICAgICBjb25uZWN0ZWQgYnkgdGhlIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRoaXMgcGVyY2VudGFnZSBwZW9wbGUNCiAgICAgICAgICAgIHdpdGhpbiBiaWtpbmcgZGlzdGFuY2UuJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0DQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0Lmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KLS0gdHJhbnNpdCBwb3Agc2hlZCBtZWRpYW4gbG93IHN0cmVzcyBhY2Nlc3Mgc2NvcmUNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMgKA0KICAgIGNhdGVnb3J5LCBzY29yZV9uYW1lLCBzY29yZSwgbm90ZXMsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdUcmFuc2l0JywNCiAgICAgICAgJ01lZGlhbiB0cmFuc2l0IHBvcHVsYXRpb24gc2hlZCBzY29yZScsDQogICAgICAgIHBlcmNlbnRpbGVfZGlzYygwLjUpIFdJVEhJTiBHUk9VUChPUkRFUiBCWSBDQVNFIFdIRU4gcG9wX2hpZ2hfc3RyZXNzPTAgVEhFTiAwIEVMU0UgcG9wX2xvd19zdHJlc3M6OkZMT0FUL3BvcF9oaWdoX3N0cmVzcyBFTkQpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnU2NvcmUgb2YgcG9wdWxhdGlvbiB3aXRoIGxvdyBzdHJlc3MgYWNjZXNzIHRvIHRyYW5zaXQgc3RhdGlvbnMNCiAgICAgICAgICAgIGluIHRoZSBzdHVkeSBhcmVhIHRvIHRvdGFsIHBvcHVsYXRpb24gd2l0aGluIHRoZSBiaWtlIHNoZWQNCiAgICAgICAgICAgIG9mIGVhY2ggdHJhbnNpdCBzdGF0aW9ucyBleHByZXNzZWQgYXMgYSBtZWRpYW4gb2YgYWxsDQogICAgICAgICAgICB0cmFuc2l0IHN0YXRpb25zIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnSGFsZiBvZiB0cmFuc2l0IHN0YXRpb25zIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIGhhbGYgYXJlIGNvbm5lY3RlZCB0byBhIGxvd2VyIHBlcmNlbnRhZ2UuDQogICAgICAgICAgICAoaWYgb25seSBvbmUgdHJhbnNpdCBzdGF0aW9uIGV4aXN0cyB0aGlzIGlzIHRoZSBzY29yZSBmb3IgdGhhdCBvbmUNCiAgICAgICAgICAgIGxvY2F0aW9uKScsJ1xuXHMrJywnICcsJ2cnKQ0KRlJPTSAgICBkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdA0KV0hFUkUgICBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IEFTIGINCiAgICAgICAgICAgIFdIRVJFICAgU1RfSW50ZXJzZWN0cyhkZXN0aW5hdGlvbnMuc2FfdHJhbnNpdC5nZW9tX3B0LGIuZ2VvbWV0cnkpDQogICAgICAgICk7DQoNCi0tIHRyYW5zaXQgcG9wIHNoZWQgNzB0aCBwZXJjZW50aWxlIGxvdyBzdHJlc3MgYWNjZXNzIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzICgNCiAgICBjYXRlZ29yeSwgc2NvcmVfbmFtZSwgc2NvcmUsIG5vdGVzLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnVHJhbnNpdCcsDQogICAgICAgICc3MHRoIHBlcmNlbnRpbGUgdHJhbnNpdCBwb3B1bGF0aW9uIHNoZWQgc2NvcmUnLA0KICAgICAgICBwZXJjZW50aWxlX2Rpc2MoMC43KSBXSVRISU4gR1JPVVAoT1JERVIgQlkgQ0FTRSBXSEVOIHBvcF9oaWdoX3N0cmVzcz0wIFRIRU4gMCBFTFNFIHBvcF9sb3dfc3RyZXNzOjpGTE9BVC9wb3BfaGlnaF9zdHJlc3MgRU5EKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJ1Njb3JlIG9mIHBvcHVsYXRpb24gd2l0aCBsb3cgc3RyZXNzIGFjY2VzcyB0byB0cmFuc2l0IHN0YXRpb25zDQogICAgICAgICAgICBpbiB0aGUgc3R1ZHkgYXJlYSB0byB0b3RhbCBwb3B1bGF0aW9uIHdpdGhpbiB0aGUgYmlrZSBzaGVkDQogICAgICAgICAgICBvZiBlYWNoIHRyYW5zaXQgc3RhdGlvbnMgZXhwcmVzc2VkIGFzIHRoZSA3MHRoIHBlcmNlbnRpbGUgb2YgYWxsDQogICAgICAgICAgICB0cmFuc2l0IHN0YXRpb25zIGluIHRoZSBzdHVkeSBhcmVhJywnXG5ccysnLCcgJywnZycpLA0KICAgICAgICByZWdleHBfcmVwbGFjZSgnMzAlIG9mIHRyYW5zaXQgc3RhdGlvbnMgaW4gdGhlIHN0dWR5IGFyZWEgaGF2ZSBsb3cgc3RyZXNzDQogICAgICAgICAgICBjb25uZWN0aW9ucyB0byBhIGhpZ2hlciBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoaW4gYmlraW5nDQogICAgICAgICAgICBkaXN0YW5jZSwgNzAlIGFyZSBjb25uZWN0ZWQgdG8gYSBsb3dlciBwZXJjZW50YWdlLg0KICAgICAgICAgICAgKGlmIG9ubHkgb25lIHRyYW5zaXQgc3RhdGlvbiBleGlzdHMgdGhpcyBpcyB0aGUgc2NvcmUgZm9yIHRoYXQgb25lDQogICAgICAgICAgICBsb2NhdGlvbiknLCdcblxzKycsJyAnLCdnJykNCkZST00gICAgZGVzdGluYXRpb25zLnNhX3RyYW5zaXQNCldIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoZGVzdGluYXRpb25zLnNhX3RyYW5zaXQuZ2VvbV9wdCxiLmdlb21ldHJ5KQ0KICAgICAgICApOw0KDQotLSB0cmFuc2l0IHBvcCBzaGVkIDMwdGggcGVyY2VudGlsZSBsb3cgc3RyZXNzIGFjY2VzcyBzY29yZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cyAoDQogICAgY2F0ZWdvcnksIHNjb3JlX25hbWUsIHNjb3JlLCBub3RlcywgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ1RyYW5zaXQnLA0KICAgICAgICAnMzB0aCBwZXJjZW50aWxlIHRyYW5zaXQgcG9wdWxhdGlvbiBzaGVkIHNjb3JlJywNCiAgICAgICAgcGVyY2VudGlsZV9kaXNjKDAuMykgV0lUSElOIEdST1VQKE9SREVSIEJZIENBU0UgV0hFTiBwb3BfaGlnaF9zdHJlc3M9MCBUSEVOIDAgRUxTRSBwb3BfbG93X3N0cmVzczo6RkxPQVQvcG9wX2hpZ2hfc3RyZXNzIEVORCksDQogICAgICAgIHJlZ2V4cF9yZXBsYWNlKCdTY29yZSBvZiBwb3B1bGF0aW9uIHdpdGggbG93IHN0cmVzcyBhY2Nlc3MgdG8gdHJhbnNpdCBzdGF0aW9ucw0KICAgICAgICAgICAgaW4gdGhlIHN0dWR5IGFyZWEgdG8gdG90YWwgcG9wdWxhdGlvbiB3aXRoaW4gdGhlIGJpa2Ugc2hlZA0KICAgICAgICAgICAgb2YgZWFjaCB0cmFuc2l0IHN0YXRpb25zIGV4cHJlc3NlZCBhcyB0aGUgMzB0aCBwZXJjZW50aWxlIG9mIGFsbA0KICAgICAgICAgICAgdHJhbnNpdCBzdGF0aW9ucyBpbiB0aGUgc3R1ZHkgYXJlYScsJ1xuXHMrJywnICcsJ2cnKSwNCiAgICAgICAgcmVnZXhwX3JlcGxhY2UoJzcwJSBvZiB0cmFuc2l0IHN0YXRpb25zIGluIHRoZSBzdHVkeSBhcmVhIGhhdmUgbG93IHN0cmVzcw0KICAgICAgICAgICAgY29ubmVjdGlvbnMgdG8gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2l0aGluIGJpa2luZw0KICAgICAgICAgICAgZGlzdGFuY2UsIDMwJSBhcmUgY29ubmVjdGVkIHRvIGEgbG93ZXIgcGVyY2VudGFnZS4NCiAgICAgICAgICAgIChpZiBvbmx5IG9uZSB0cmFuc2l0IHN0YXRpb24gZXhpc3RzIHRoaXMgaXMgdGhlIHNjb3JlIGZvciB0aGF0IG9uZQ0KICAgICAgICAgICAgbG9jYXRpb24pJywnXG5ccysnLCcgJywnZycpDQpGUk9NICAgIGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0DQpXSEVSRSAgIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgcmVjZWl2ZWQuc2FfYm91bmRhcnkgQVMgYg0KICAgICAgICAgICAgV0hFUkUgICBTVF9JbnRlcnNlY3RzKGRlc3RpbmF0aW9ucy5zYV90cmFuc2l0Lmdlb21fcHQsYi5nZW9tZXRyeSkNCiAgICAgICAgKTsNCg0KU0VMRUNUICogRlJPTSBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzOw0KYGBgDQoNCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLCBpbmNsdWRlID0gRkFMU0UsIG91dHB1dC52YXIgPSAiYm5hX3Njb3JlIn0NCg0KRFJPUCBUQUJMRSBJRiBFWElTVFMgZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzOw0KDQpDUkVBVEUgVEFCTEUgZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksDQogICAgc2NvcmVfaWQgVEVYVCwNCiAgICBzY29yZV9vcmlnaW5hbCBOVU1FUklDKDE2LDQpLA0KICAgIHNjb3JlX25vcm1hbGl6ZWQgTlVNRVJJQygxNiw0KSwNCiAgICBodW1hbl9leHBsYW5hdGlvbiBURVhUDQopOw0KDQotLSBwb3B1bGF0aW9uDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ3Blb3BsZScsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2VfcG9wOw0KDQotLSBlbXBsb3ltZW50DQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ29wcG9ydHVuaXR5X2VtcGxveW1lbnQnLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX2VtcDsNCg0KLS0gazEyIGVkdWNhdGlvbg0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdvcHBvcnR1bml0eV9rMTJfZWR1Y2F0aW9uJywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV9rMTI7DQoNCi0tIHRlY2ggc2Nob29sDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ29wcG9ydHVuaXR5X3RlY2huaWNhbF92b2NhdGlvbmFsX2NvbGxlZ2UnLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX3RlY2g7DQoNCi0tIGhpZ2hlciBlZA0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdvcHBvcnR1bml0eV9oaWdoZXJfZWR1Y2F0aW9uJywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV91bml2Ow0KDQotLSBvcHBvcnR1bml0eQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdvcHBvcnR1bml0eScsDQogICAgICAgICgNCiAgICAgICAgICAgIDAuMzUgKiAoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ29wcG9ydHVuaXR5X2VtcGxveW1lbnQnKQ0KICAgICAgICAgICAgKyAwLjM1ICogKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICdvcHBvcnR1bml0eV9rMTJfZWR1Y2F0aW9uJykNCiAgICAgICAgICAgICsgMC4xICogKHNlbGVjdCBzY29yZV9vcmlnaW5hbCBmcm9tIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyB3aGVyZSBzY29yZV9pZCA9ICdvcHBvcnR1bml0eV90ZWNobmljYWxfdm9jYXRpb25hbF9jb2xsZWdlJykNCiAgICAgICAgICAgICsgMC4yICogKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICdvcHBvcnR1bml0eV9oaWdoZXJfZWR1Y2F0aW9uJykNCiAgICAgICAgKSAvDQogICAgICAgICgNCiAgICAgICAgICAgIDAuMzUNCiAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIHNjaG9vbHNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMzUNCiAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIGNvbGxlZ2VzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjENCiAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIHVuaXZlcnNpdGllc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgIFRIRU4gMC4yDQogICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgRU5EDQogICAgICAgICksDQogICAgICAgIE5VTEw7DQoNCi0tIGRvY3RvcnMNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnY29yZV9zZXJ2aWNlc19kb2N0b3JzJywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV9kb2N0b3I7DQoNCi0tIGRlbnRpc3RzDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ2NvcmVfc2VydmljZXNfZGVudGlzdHMnLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX2RlbnRpc3Q7DQoNCi0tIGhvc3BpdGFscw0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdjb3JlX3NlcnZpY2VzX2hvc3BpdGFscycsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2VfaG9zcGl0YWw7DQoNCi0tIHBoYXJtYWNpZXMNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnY29yZV9zZXJ2aWNlc19waGFybWFjaWVzJywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV9waGFybWFjeTsNCg0KLS0gZ3JvY2VyeQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdjb3JlX3NlcnZpY2VzX2dyb2NlcnknLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX2dyb2Nlcnk7DQoNCi0tIHNvY2lhbCBzZXJ2aWNlcw0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdjb3JlX3NlcnZpY2VzX3NvY2lhbF9zZXJ2aWNlcycsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2Vfc29jaWFsX3N2Y3M7DQoNCi0tIGNvcmUgc2VydmljZXMNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAnY29yZV9zZXJ2aWNlcycsDQogICAgICAgIENBU0UNCiAgICAgICAgV0hFTiBFWElTVFMgKA0KICAgICAgICAgICAgU0VMRUNUICAxDQogICAgICAgICAgICBGUk9NICAgIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZA0KICAgICAgICAgICAgV0hFUkUgICBkb2N0b3JzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgT1IgICAgICBkZW50aXN0c19oaWdoX3N0cmVzcyA+IDANCiAgICAgICAgICAgIE9SICAgICAgaG9zcGl0YWxzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgT1IgICAgICBwaGFybWFjaWVzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgT1IgICAgICBzdXBlcm1hcmtldHNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICBPUiAgICAgIHNvY2lhbF9zZXJ2aWNlc19oaWdoX3N0cmVzcyA+IDANCiAgICAgICAgKQ0KICAgICAgICAgICAgVEhFTiAgICAoDQogICAgICAgICAgICAgICAgICAgICAgICAwLjIgKiAoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ2NvcmVfc2VydmljZXNfZG9jdG9ycycpDQogICAgICAgICAgICAgICAgICAgICAgICArIDAuMSAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnY29yZV9zZXJ2aWNlc19kZW50aXN0cycpDQogICAgICAgICAgICAgICAgICAgICAgICArIDAuMiAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAnY29yZV9zZXJ2aWNlc19ob3NwaXRhbHMnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjEgKiAoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ2NvcmVfc2VydmljZXNfcGhhcm1hY2llcycpDQogICAgICAgICAgICAgICAgICAgICAgICArIDAuMjUgKiAoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ2NvcmVfc2VydmljZXNfZ3JvY2VyeScpDQogICAgICAgICAgICAgICAgICAgICAgICArIDAuMTUgKiAoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ2NvcmVfc2VydmljZXNfc29jaWFsX3NlcnZpY2VzJykNCiAgICAgICAgICAgICAgICAgICAgKSAvDQogICAgICAgICAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSBkb2N0b3JzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSEVOIDAuMg0KICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIGRlbnRpc3RzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIGhvc3BpdGFsc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4yDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSBwaGFybWFjaWVzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4yNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjE1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgRUxTRSBOVUxMDQogICAgICAgIEVORCwNCiAgICAgICAgTlVMTDsNCg0KLS0gcmV0YWlsDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ3JldGFpbCcsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2VfcmV0YWlsOw0KDQotLSBwYXJrcw0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdyZWNyZWF0aW9uX3BhcmtzJywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV9wYXJrczsNCg0KLS0gdHJhaWxzDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ3JlY3JlYXRpb25fdHJhaWxzJywNCiAgICAgICAgQ09BTEVTQ0UoZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5zY29yZSwwKSwNCiAgICAgICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cy5odW1hbl9leHBsYW5hdGlvbg0KRlJPTSAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzDQpXSEVSRSAgIHVzZV90cmFpbHM7DQoNCi0tIGNvbW11bml0eV9jZW50ZXJzDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ3JlY3JlYXRpb25fY29tbXVuaXR5X2NlbnRlcnMnLA0KICAgICAgICBDT0FMRVNDRShnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLnNjb3JlLDApLA0KICAgICAgICBnZW5lcmF0ZWQuc2Ffc2NvcmVfaW5wdXRzLmh1bWFuX2V4cGxhbmF0aW9uDQpGUk9NICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMNCldIRVJFICAgdXNlX2NvbW1fY3RyczsNCg0KLS0gcmVjcmVhdGlvbg0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgICdyZWNyZWF0aW9uJywNCiAgICAgICAgQ0FTRQ0KICAgICAgICBXSEVOIEVYSVNUUyAoDQogICAgICAgICAgICBTRUxFQ1QgIDENCiAgICAgICAgICAgIEZST00gICAgZ2VuZXJhdGVkLnNhX3BvcF9ncmlkDQogICAgICAgICAgICBXSEVSRSAgIHBhcmtzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICAgICAgT1IgICAgICB0cmFpbHNfaGlnaF9zdHJlc3MgPiAwDQogICAgICAgICAgICBPUiAgICAgIGNvbW11bml0eV9jZW50ZXJzX2hpZ2hfc3RyZXNzID4gMA0KICAgICAgICApDQogICAgICAgICAgICBUSEVOICAgICgNCiAgICAgICAgICAgICAgICAgICAgICAgIDAuNCAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAncmVjcmVhdGlvbl9wYXJrcycpDQogICAgICAgICAgICAgICAgICAgICAgICArIDAuMzUgKiAoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ3JlY3JlYXRpb25fdHJhaWxzJykNCiAgICAgICAgICAgICAgICAgICAgICAgICsgMC4yNSAqIChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAncmVjcmVhdGlvbl9jb21tdW5pdHlfY2VudGVycycpDQogICAgICAgICAgICAgICAgICAgICkgLw0KICAgICAgICAgICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgICAgICAgICBDQVNFDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgcGFya3NfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC40DQogICAgICAgICAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgdHJhaWxzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhFTiAwLjM1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICAgICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSBjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIRU4gMC4yNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgIEVMU0UgTlVMTA0KICAgICAgICBFTkQsDQogICAgICAgIE5VTEw7DQoNCi0tIHRyYW5zaXQNCklOU0VSVCBJTlRPIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyAoDQogICAgc2NvcmVfaWQsIHNjb3JlX29yaWdpbmFsLCBodW1hbl9leHBsYW5hdGlvbg0KKQ0KU0VMRUNUICAndHJhbnNpdCcsDQogICAgICAgIENPQUxFU0NFKGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuc2NvcmUsMCksDQogICAgICAgIGdlbmVyYXRlZC5zYV9zY29yZV9pbnB1dHMuaHVtYW5fZXhwbGFuYXRpb24NCkZST00gICAgZ2VuZXJhdGVkLnNhX3Njb3JlX2lucHV0cw0KV0hFUkUgICB1c2VfdHJhbnNpdDsNCg0KLS0gY2FsY3VsYXRlIG92ZXJhbGwgbmVpZ2hib3Job29kIHNjb3JlDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ292ZXJhbGxfc2NvcmUnLA0KICAgICAgICAoDQogICAgICAgICAgICA/cGVvcGxlICogQ09BTEVTQ0UoKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICdwZW9wbGUnKSwwKQ0KICAgICAgICAgICAgKyA/b3Bwb3J0dW5pdHkgKiBDT0FMRVNDRSgoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ29wcG9ydHVuaXR5JyksMCkNCiAgICAgICAgICAgICsgP2NvcmVfc2VydmljZXMgKiBDT0FMRVNDRSgoU0VMRUNUIHNjb3JlX29yaWdpbmFsIEZST00gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzIFdIRVJFIHNjb3JlX2lkID0gJ2NvcmVfc2VydmljZXMnKSwwKQ0KICAgICAgICAgICAgKyA/cmV0YWlsICogQ09BTEVTQ0UoKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICdyZXRhaWwnKSwwKQ0KICAgICAgICAgICAgKyA/cmVjcmVhdGlvbiAqIENPQUxFU0NFKChTRUxFQ1Qgc2NvcmVfb3JpZ2luYWwgRlJPTSBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgV0hFUkUgc2NvcmVfaWQgPSAncmVjcmVhdGlvbicpLDApDQogICAgICAgICAgICArID90cmFuc2l0ICogQ09BTEVTQ0UoKFNFTEVDVCBzY29yZV9vcmlnaW5hbCBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3JlcyBXSEVSRSBzY29yZV9pZCA9ICd0cmFuc2l0JyksMCkNCiAgICAgICAgKSAvDQogICAgICAgICgNCiAgICAgICAgICAgID9wZW9wbGUgKyA/b3Bwb3J0dW5pdHkNCiAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIGRvY3RvcnNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOID9jb3JlX3NlcnZpY2VzDQogICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIGRlbnRpc3RzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgVEhFTiA/Y29yZV9zZXJ2aWNlcw0KICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSBob3NwaXRhbHNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOID9jb3JlX3NlcnZpY2VzDQogICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIHBoYXJtYWNpZXNfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOID9jb3JlX3NlcnZpY2VzDQogICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIHN1cGVybWFya2V0c19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgIFRIRU4gP2NvcmVfc2VydmljZXMNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgc29jaWFsX3NlcnZpY2VzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgVEhFTiA/Y29yZV9zZXJ2aWNlcw0KICAgICAgICAgICAgICAgIEVMU0UgMA0KICAgICAgICAgICAgICAgIEVORA0KICAgICAgICAgICAgKyAgIENBU0UNCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgcmV0YWlsX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgVEhFTiA/cmV0YWlsDQogICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgRU5EDQogICAgICAgICAgICArICAgQ0FTRQ0KICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSBwYXJrc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgIFRIRU4gP3JlY3JlYXRpb24NCiAgICAgICAgICAgICAgICBXSEVOIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQgV0hFUkUgdHJhaWxzX2hpZ2hfc3RyZXNzID4gMCkNCiAgICAgICAgICAgICAgICAgICAgVEhFTiA/cmVjcmVhdGlvbg0KICAgICAgICAgICAgICAgIFdIRU4gRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGdlbmVyYXRlZC5zYV9wb3BfZ3JpZCBXSEVSRSBjb21tdW5pdHlfY2VudGVyc19oaWdoX3N0cmVzcyA+IDApDQogICAgICAgICAgICAgICAgICAgIFRIRU4gP3JlY3JlYXRpb24NCiAgICAgICAgICAgICAgICBFTFNFIDANCiAgICAgICAgICAgICAgICBFTkQNCiAgICAgICAgICAgICsgICBDQVNFDQogICAgICAgICAgICAgICAgV0hFTiBFWElTVFMgKFNFTEVDVCAxIEZST00gZ2VuZXJhdGVkLnNhX3BvcF9ncmlkIFdIRVJFIHRyYW5zaXRfaGlnaF9zdHJlc3MgPiAwKQ0KICAgICAgICAgICAgICAgICAgICBUSEVOID90cmFuc2l0DQogICAgICAgICAgICAgICAgRUxTRSAwDQogICAgICAgICAgICAgICAgRU5EDQogICAgICAgICksDQogICAgICAgIE5VTEw7DQoNCi0tIG5vcm1hbGl6ZQ0KVVBEQVRFICBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMNClNFVCAgICAgc2NvcmVfbm9ybWFsaXplZCA9IHNjb3JlX29yaWdpbmFsICogP3RvdGFsOw0KDQotLSBwb3B1bGF0aW9uDQpJTlNFUlQgSU5UTyBnZW5lcmF0ZWQuc2Ffb3ZlcmFsbF9zY29yZXMgKA0KICAgIHNjb3JlX2lkLCBzY29yZV9vcmlnaW5hbCwgaHVtYW5fZXhwbGFuYXRpb24NCikNClNFTEVDVCAgJ3BvcHVsYXRpb25fdG90YWwnLA0KICAgICAgICAoDQogICAgICAgICAgICBTRUxFQ1QgU1VNKHBhcnRpYWxfcCkgRlJPTSBnZW5lcmF0ZWQuc2FfcG9wX2dyaWQNCiAgICAgICAgICAgIFdIRVJFICAgRVhJU1RTICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSAgICByZWNlaXZlZC5zYV9ib3VuZGFyeSBBUyBiDQogICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAgIFNUX0ludGVyc2VjdHMoYi5nZW9tZXRyeSxnZW5lcmF0ZWQuc2FfcG9wX2dyaWQuZ2VvbWV0cnkpDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgKSwNCiAgICAgICAgJ1RvdGFsIHBvcHVsYXRpb24gb2YgYm91bmRhcnknOw0KDQoNCi0tIGhpZ2ggYW5kIGxvdyBzdHJlc3MgdG90YWwgbWlsZWFnZQ0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgJ3RvdGFsX2ttX2xvd19zdHJlc3MnLA0KICAgICgNCiAgICAgICAgU0VMRUNUDQogICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgU1VNKFNUX0xlbmd0aChTVF9JbnRlcnNlY3Rpb24ody5nZW9tLCBiLmdlb21ldHJ5KSkgKg0KICAgICAgICAgICAgICAgICAgICBDQVNFIGZ0X3NlZ19zdHJlc3MgV0hFTiAxIFRIRU4gMSBFTFNFIDAgRU5EKSArDQogICAgICAgICAgICAgICAgU1VNKFNUX0xlbmd0aChTVF9JbnRlcnNlY3Rpb24ody5nZW9tLCBiLmdlb21ldHJ5KSkgKg0KICAgICAgICAgICAgICAgICAgICBDQVNFIHRmX3NlZ19zdHJlc3MgV0hFTiAxIFRIRU4gMSBFTFNFIDAgRU5EKQ0KICAgICAgICAgICAgKSAvIDEwMDAgYXMgZGlzdA0KICAgICAgICBGUk9NIHJlY2VpdmVkLnNhX3dheXMgYXMgdywgcmVjZWl2ZWQuc2FfYm91bmRhcnkgYXMgYg0KICAgICAgICBXSEVSRSBTVF9JbnRlcnNlY3RzKHcuZ2VvbSwgYi5nZW9tZXRyeSkNCiAgICApLA0KICAgICdUb3RhbCBsb3ctc3RyZXNzIGttJzsNCg0KSU5TRVJUIElOVE8gZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzICgNCiAgICBzY29yZV9pZCwgc2NvcmVfb3JpZ2luYWwsIGh1bWFuX2V4cGxhbmF0aW9uDQopDQpTRUxFQ1QgJ3RvdGFsX2ttX2hpZ2hfc3RyZXNzJywNCiAgICAoDQogICAgICAgIFNFTEVDVA0KICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgIFNVTShTVF9MZW5ndGgoU1RfSW50ZXJzZWN0aW9uKHcuZ2VvbSwgYi5nZW9tZXRyeSkpICoNCiAgICAgICAgICAgICAgICAgICAgQ0FTRSBmdF9zZWdfc3RyZXNzIFdIRU4gMyBUSEVOIDEgRUxTRSAwIEVORCkgKw0KICAgICAgICAgICAgICAgIFNVTShTVF9MZW5ndGgoU1RfSW50ZXJzZWN0aW9uKHcuZ2VvbSwgYi5nZW9tZXRyeSkpICoNCiAgICAgICAgICAgICAgICAgICAgQ0FTRSB0Zl9zZWdfc3RyZXNzIFdIRU4gMyBUSEVOIDEgRUxTRSAwIEVORCkNCiAgICAgICAgICAgICkgLyAxMDAwIGFzIGRpc3QNCiAgICAgICAgRlJPTSByZWNlaXZlZC5zYV93YXlzIGFzIHcsIHJlY2VpdmVkLnNhX2JvdW5kYXJ5IGFzIGINCiAgICAgICAgV0hFUkUgU1RfSW50ZXJzZWN0cyh3Lmdlb20sIGIuZ2VvbWV0cnkpDQogICAgKSwNCiAgICAnVG90YWwgaGlnaC1zdHJlc3Mga20nOw0KDQpVUERBVEUgZ2VuZXJhdGVkLnNhX292ZXJhbGxfc2NvcmVzDQpTRVQgICAgc2NvcmVfbm9ybWFsaXplZCA9IFJPVU5EKHNjb3JlX29yaWdpbmFsLCAxKQ0KV0hFUkUgIHNjb3JlX2lkIGluICgndG90YWxfa21fbG93X3N0cmVzcycsICd0b3RhbF9rbV9oaWdoX3N0cmVzcycpOw0KDQpTRUxFQ1QgKiBGUk9NIGdlbmVyYXRlZC5zYV9vdmVyYWxsX3Njb3Jlcw0KYGBgDQoNCiMjIFJlc3VsdHMgDQoNClRoZSBvdmVyYWxsIHJlc3VsdHMgb2J0YWluZWQgaW5jbHVkZSB0aGUgZmluYWwgc2NvcmUgZm9yIHRoZSB3aG9sZSBjaXR5LCBhcyB3ZWxsIGFzIHRoZSBzY29yZSBwZXIgZGVzdGluYXRpb24gY2F0ZWdvcnkuIFRoZSB0b3RhbCBwb3B1bGF0aW9uIGFuZCBzdHJlc3MgbmV0d29yayBpcyBhbHNvIGNhbGN1bGF0ZWQuIFRoZSByZXN1bHRzIGNhbiBiZSBvYnNlcnZlZCBvbiB0aGUgZm9sbG93aW5nIHRhYmxlLiANCg0KYGBge3IsIGVjaG8gPSBGQUxTRX0NCmJuYV9kaXNwbGF5IDwtIGJuYV9zY29yZQ0KDQpibmFfZGlzcGxheSRjYXRlZ29yeSA8LSBjKA0KICAiVG90YWwgUGVvcGxlIiwNCiAgIkVtcGxveW1lbnQiLA0KICAiSy0xMiBFZHVjYXRpb24iLA0KICAiVGVjaG5pY2FsL3ZvY2F0aW9uYWwgc2Nob29sIiwNCiAgIkhpZ2hlciBFZHVjYXRpb24iLA0KICAiVG90YWwgT3Bwb3J0dW5pdHkiLA0KICAiRG9jdG9yIG9mZmljZXMvY2xpbmljcyIsDQogICJEZW50aXN0IG9mZmljZXMiLA0KICAiSG9zcGl0YWxzIiwNCiAgIlBoYXJtYWNpZXMiLA0KICAiU3VwZXJtYXJrZXRzIiwNCiAgIlNvY2lhbCBzZXJ2aWNlcyIsDQogICJUb3RhbCBDb3JlIFNlcnZpY2VzIiwNCiAgIlRvdGFsIFJldGFpbCBzaG9wcGluZyIsDQogICJQYXJrcyIsDQogICJSZWNyZWF0aW9uYWwgdHJhaWxzIiwNCiAgIkNvbW11bml0eSBjZW50ZXJzIiwNCiAgIlRvdGFsIFJlY3JlYXRpb24iLA0KICAiVG90YWwgVHJhbnNpdCIsDQogICJPdmVyYWxsIFNjb3JlIiwNCiAgIlBvcHVsYXRpb24iLA0KICAiTGVuZ3RoIG9mIExvdyBTdHJlc3MgTmV0d29yayAoa20pIiwNCiAgIkxlbmd0aCBvZiBIaWdoIFN0cmVzcyBOZXR3b3JrIChrbSkiDQopDQoNCmJuYV9kaXNwbGF5JGlkIDwtIE5VTEwNCmJuYV9kaXNwbGF5JHNjb3JlX2lkIDwtIE5VTEwNCg0KYm5hX2Rpc3BsYXkkc2NvcmUgPC0gYm5hX2Rpc3BsYXkkc2NvcmVfbm9ybWFsaXplZA0KYm5hX2Rpc3BsYXlbMjEsNV0gPC0gcm91bmQoYm5hX2Rpc3BsYXlbMjEsMV0sMCkNCg0KYm5hX2Rpc3BsYXkkc2NvcmVfb3JpZ2luYWwgPC0gTlVMTA0KYm5hX2Rpc3BsYXkkc2NvcmVfbm9ybWFsaXplZCA8LSBOVUxMDQoNCmJuYV9kaXNwbGF5IDwtIGJuYV9kaXNwbGF5W2MoMjA6MjMsMToxOSksXQ0Kcm93Lm5hbWVzKGJuYV9kaXNwbGF5KSA8LSBOVUxMDQoNCmJuYV9kaXNwbGF5IDwtIGJuYV9kaXNwbGF5ICU+JSBtdXRhdGUoDQogIGNhdGVnb3J5ID0gY2VsbF9zcGVjKA0KICAgIGNhdGVnb3J5LA0KICAgIGJvbGQgPSBpZmVsc2UoDQogICAgICBncmVwbCgiVG90YWwiLGNhdGVnb3J5KSwNCiAgICAgIFQsIA0KICAgICAgRg0KICAgICkNCiAgKSwNCiAgc2NvcmUgPSBjZWxsX3NwZWMoDQogICAgc2NvcmUsDQogICAgImh0bWwiLCANCiAgICBjb2xvciA9IGlmZWxzZSgNCiAgICAgIHNjb3JlID49IDU0ICYgc2NvcmUgPCAxMDAsDQogICAgICAiIzAwOWFjZCIsDQogICAgICBpZmVsc2UoDQogICAgICAgIHNjb3JlIDwgNTQsDQogICAgICAgICIjZmYzMDMwIiwNCiAgICAgICAgIiM2NjY2NjYiDQogICAgICAgICkNCiAgICApDQogICkNCikNCg0KY29sbmFtZXMoYm5hX2Rpc3BsYXkpIDwtIGMoInBvcG92ZXIiLCIiLCJTY29yZS9WYWx1ZSIpDQoNCmthYmxlKA0KICBibmFfZGlzcGxheVsyOjNdLCANCiAgYWxpZ24gPSBjKCJsIiwiciIpLCANCiAgZm9ybWF0ID0gImh0bWwiLCANCiAgZXNjYXBlID0gRg0KKSAlPiUgDQogICBrYWJsZV9zdHlsaW5nKA0KICAgICAiaG92ZXIiLA0KICAgICBmdWxsX3dpZHRoID0gRkFMU0UsDQogICAgIHBvc2l0aW9uID0gImNlbnRlciINCiAgKSAlPiUgDQogIGdyb3VwX3Jvd3MoIlBlb3BsZSIsIDUsIDUpICU+JSANCiAgZ3JvdXBfcm93cygiT3Bwb3J0dW5pdHkiLCA2LCAxMCkgJT4lIA0KICBncm91cF9yb3dzKCJDb3JlIFNlcnZpY2VzIiwgMTEsIDE3KSAlPiUgDQogIGdyb3VwX3Jvd3MoIlJldGFpbCIsIDE4LCAxOCkgJT4lDQogIGdyb3VwX3Jvd3MoIlJlY3JlYXRpb24iLCAxOSwgMjIpICU+JSANCiAgZ3JvdXBfcm93cygiVHJhbnNpdCIsIDIzLCAyMykNCmBgYA0KDQpXZSBjYW4gcGxvdCB0aGUgcmVzdWx0cyB0byBoYXZlIGEgcXVpY2sgdmlldyBvZiB0aGUgb3V0cHV0LCBpbmNsdWRpbmcgdGhlIGhpZ2ggYW5kIGxvdyBzdHJlc3MgbmV0d29yayBpbiBhbiBpbnRlcmFjdGl2ZSB3YXkuIA0KDQpgYGB7cn0NCmxpYnJhcnkoc2YpDQpwb3AgPC0gc3RfcmVhZCgNCiAgZHNuID0gY29ubmVjdGlvbiwNCiAgbGF5ZXIgPSBjKCJnZW5lcmF0ZWQiLCJzYV9wb3BfZ3JpZCIpDQopDQoNCndheXMgPC0gc3RfcmVhZCgNCiAgZHNuID0gY29ubmVjdGlvbiwNCiAgcXVlcnkgPSAiU0VMRUNUIGZ0X3NlZ19zdHJlc3MsIHRmX3NlZ19zdHJlc3MsIGdlb20gRlJPTSByZWNlaXZlZC5zYV93YXlzIg0KKQ0KYGBgDQoNCmBgYHtyfQ0KYm5hX3BhbCA8LSBjKCIjRkM3MTUxIiwiI0RDN0U2QSIsIiNDOTg4NzUiLCIjQzA4QjgzIiwiI0FEOTM5NiIsDQogICAgICAgICAgICAgIiM5QzlBOUYiLCIjOTI5RUFDIiwiIzc4QUFDNSIsIiM2RkFEQ0IiLCIjNDlCRkU2IikNCg0KYm5hX2JyZWFrcyA8LSBjKDYsMTIsMTgsMjQsMzAsMzYsNDIsNDgsNTQsMTAwKQ0KDQp3YXlzJGZ0X3N0cmVzcyA8LSBpZmVsc2Uod2F5cyRmdF9zZWdfc3RyZXNzID09IDEsImxvdyBzdHJlc3MiLCJoaWdoIHN0cmVzcyIpDQp3YXlzJHRmX3N0cmVzcyA8LSBpZmVsc2Uod2F5cyR0Zl9zZWdfc3RyZXNzID09IDEsImxvdyBzdHJlc3MiLCJoaWdoIHN0cmVzcyIpDQoNCmxpYnJhcnkodG1hcCkNCnRtYXBfbW9kZSgidmlldyIpDQppbnRfbWFwIDwtIA0KICB0bWFwOjp0bWFwX2xlYWZsZXQoDQogICAgIHRtYXA6OnRtX3ZpZXcoDQogICAgIGJhc2VtYXBzID0gYygNCiAgICAgICAiQ2FydG9EQi5Qb3NpdHJvbiIsDQogICAgICAgIkNhcnRvREIuRGFya01hdHRlciIsDQogICAgICAgIk9wZW5TdHJlZXRNYXAuTWFwbmlrIg0KICAgICApDQogICApICsNCiAgICAgdG1hcDo6dG1fc2hhcGUocG9wKSArDQogICAgIHRtYXA6OnRtX3BvbHlnb25zKA0KICAgICAgIGNvbCA9ICJvdmVyYWxsX3Njb3JlIiwNCiAgICAgICBzdHlsZSA9ICJmaXhlZCIsDQogICAgICAgYnJlYWtzID0gYm5hX2JyZWFrcywNCiAgICAgICBwYWxldHRlID0gYm5hX3BhbCwNCiAgICAgICBhbHBoYSA9IDAuOCwNCiAgICAgICB0aXRsZSA9ICJCTkEgc2NvcmUiLA0KICAgICAgIGJvcmRlci5jb2wgPSBOVUxMLA0KICAgICAgIGNvbG9yTkEgPSBOVUxMLA0KICAgICAgIHNob3dOQSA9IEZBTFNFDQogICAgICApICsNCiAgICAgdG1hcDo6dG1fc2hhcGUod2F5cykgKw0KICAgICB0bWFwOjp0bV9saW5lcygNCiAgICAgICBjb2wgPSAiZnRfc3RyZXNzIiwgDQogICAgICAgY29sb3JOQSA9IE5VTEwsDQogICAgICAgc2hvd05BID0gRkFMU0UsDQogICAgICAgcGFsZXR0ZSA9IGMoImZpcmVicmljazEiLCAiZGVlcHNreWJsdWUzIiksDQogICAgICAgdGl0bGUuY29sID0gIlN0cmVzcyBuZXR3b3JrIg0KICAgICAgKSArDQogICAgIHRtYXA6OnRtX3NoYXBlKHdheXMpICsNCiAgICAgdG1hcDo6dG1fbGluZXMoDQogICAgICAgY29sID0gInRmX3N0cmVzcyIsIA0KICAgICAgIGNvbG9yTkEgPSBOVUxMLA0KICAgICAgIHNob3dOQSA9IEZBTFNFLA0KICAgICAgIHBhbGV0dGUgPSBjKCJmaXJlYnJpY2sxIiwgImRlZXBza3libHVlMyIpLA0KICAgICAgIGxlZ2VuZC5jb2wuc2hvdyA9IEZBTFNFDQogICAgICApDQogICkNCg0KaW50X21hcA0KYGBgDQoNCiMjIE9ic2VydmF0aW9ucw0KDQoqIFRoZSB0b3RhbCB0aW1lIHRoYXQgdGhpcyBwYXJ0aWN1bGFyIGNpdHkgdG9vayB0byBjb21wdXRlIGl0cyBCTkEsIGluY2x1ZGluZyBwbG90cyBhbmQgZGF0YSBkb3dubG9hZCB3YXM6DQoNCmBgYHtyLCBlY2hvID0gRkFMU0V9DQplbmQgPC0gU3lzLnRpbWUoKQ0KDQpkdXJhdGlvbiA8LSBlbmQgLSBzdGFydA0KDQpkdXJhdGlvbg0KYGBgDQoNCiogV2hhdCBjYW4gYmUgb2JzZXJ2ZCBmb3IgdGhlIHdob2xlIGFuYWx5c2lzIGlzIHRoYXQgdGhlIHJlc3VsdGluZyBCTkEgc2NvcmUgaXMgaGlnaGx5IGluZmx1ZW5jZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgam9iL2VtcGxveW1lbnQgZGF0YSBpcyBub3QgYXZhaWxhYmxlLiBIb3dldmVyLCB0aGlzIHdhcyBhbiBhdHRlbXB0IHRvIHJlcHJvZHVjZSB0aGUgc2NvcmUgYXMgY2xvc2UgYXMgcG9zc2libGUgYXMgUGZCIGFwcGx5IHRoZWlyIG1ldGhvZG9sb2d5LCBqdXN0IHRvIGV4cGxvcmUgaXRzIHJlcHJvZHVjaWJpbGl0eS4gDQoNCiogTXkgcGxhbiBuZXh0IGlzIHRvIGV4Y2x1ZGUgdGhpcyB2YXJpYWJsZSBmcm9tIHRoZSBCTkEgc2NvcmUgY29tcHV0YXRpb24sIGFuZCBwZXJoYXBzIGluY2x1ZGUgc29tZSBvdGhlciB2YXJpYWJsZXMgdGhhdCB3b3VsZCBzdWl0IHRoZSBFdXJvcGVhbiBjb250ZXh0IGJldHRlci4gDQoNCiogTXkgZmluYWwgZ29hbCBmb3IgdGhlIG1vbWVudCBpcyB0byB0cnkgdG8gdmFsaWRhdGUgdGhlIHNjb3JpbmcgbWV0aG9kb2xvZ3kgZm9yIEV1cm9wZS4gSSBwaWNrZWQgYSBjaXR5IGluIHRoZSBVSyBhcyBJIGtub3cgdGhlcmUgaXMgT3JpZ2luLURlc3RpbmF0aW9uIGRhdGEgYXZhaWxhYmxlIHRoYXQgY291bGQgYmUgdXNlZCBhcyBhIHZhbGlkYXRpb24gbWV0aG9kLiA=